我有以下API控制器,它们从Web UI中的某些主表(用于下拉列表)获取数据。
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%,因为它从来都不是IF中的语句,因为数据来自数据库,并且该表永远不会为空。
在这种情况下,如何保证100%的代码覆盖率?我应该删除IF吗?或者我可以在这里效仿吗?
由于
答案 0 :(得分:4)
一种选择是注入IListService,而不是在GetPersonas调用中新建它。 然后你可以(在你的单元测试中)存根/模拟该对象使它返回一个列表,或null,或任何你想要的。
答案 1 :(得分:1)
您打算创建集成测试吗?或者您想创建单元测试吗?
如果要创建单元测试,则必须抽象ListService依赖项。一旦抽象,您可以模拟或伪造依赖。一旦模拟或伪造,您可以创建处理ListService依赖项的各种返回事件的测试,即标准返回,返回null和/或可能的异常。