我有以下API控制器,它从Web UI中的某些主表(用于下拉菜单)获取数据。单元测试,如何模拟返回空数据以获得100%覆盖率
public List<Personas> GetPersonas()
{
try
{
ListService = new ListService();
var listPersonas = ListService.GetPersonas();
if (listPersonas == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return listPersonas.ToList();
}
catch (Exception ex)
{
throw new HttpResponseException(
Request.CreateErrorResponse(HttpStatusCode.NotFound, ex.Message));
}
}
然后在单元测试,我有这样的:
[TestMethod]
public void GetAllPersonas_ShouldReturnAllPersonas()
{
var controller = new ListasController();
controller.Request = new HttpRequestMessage
{
RequestUri = new Uri("http://localhost/api/Listas/GetPersonas")
};
controller.Configuration = new HttpConfiguration();
controller.Configuration.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
controller.RequestContext.RouteData = new HttpRouteData(
route: new HttpRoute(),
values: new HttpRouteValueDictionary { { "controller", "Listas" } });
var response = controller.GetPersonas() as List<Personas>;
Assert.IsNotNull(response);
Assert.AreEqual(response[0].IdPersona, 1);
Assert.IsInstanceOfType(response, typeof(List<Personas>));
}
代码工作正常,但代码覆盖率约为50%,因为它从来没有这样的中频内声明的,因为数据是未来从一个数据库,该表永远不会是空的。
在这种情况下,我如何保证100%的代码覆盖率?我应该删除IF吗?或者我可以在这里效仿一下吗?
感谢
控制器与'ListService'紧密耦合,这使得在单元测试期间替换它成为困难,因为控制器正在控制创建该依赖关系。通过将其作为显式依赖注入控制器来反转该控制。这将允许您在单元测试期间模拟/替换它,以满足您的测试场景。 – Nkosi
如果'ListService.GetPersonas'永远不会返回'null',那么检查它就没有意义了。 – Lee