2017-06-01 86 views
1

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

感谢

+1

控制器与'ListService'紧密耦合,这使得在单元测试期间替换它成为困难,因为控制器正在控制创建该依赖关系。通过将其作为显式依赖注入控制器来反转该控制。这将允许您在单元测试期间模拟/替换它,以满足您的测试场景。 – Nkosi

+1

如果'ListService.GetPersonas'永远不会返回'null',那么检查它就没有意义了。 – Lee

回答

4

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

https://autofac.org/http://nsubstitute.github.io/上有一个squiz。

1

您是否打算创建集成测试?或者你想创建一个单元测试?

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

相关问题