单元测试,如何模拟返回空数据以获得100%的覆盖率

时间:2017-06-01 13:46:10

标签: c# .net unit-testing asp.net-web-api nunit

我有以下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吗?或者我可以在这里效仿吗?

由于

2 个答案:

答案 0 :(得分:4)

一种选择是注入IListService,而不是在GetPersonas调用中新建它。 然后你可以(在你的单元测试中)存根/模拟该对象使它返回一个列表,或null,或任何你想要的。

https://autofac.org/http://nsubstitute.github.io/进行游击。

答案 1 :(得分:1)

您打算创建集成测试吗?或者您想创建单元测试吗?

如果要创建单元测试,则必须抽象ListService依赖项。一旦抽象,您可以模拟或伪造依赖。一旦模拟或伪造,您可以创建处理ListService依赖项的各种返回事件的测试,即标准返回,返回null和/或可能的异常。