3

这是我的场景:

我正在使用一个带有存储库的 .NET MVC 4.0 项目(如您所料),并尝试将 Moq/xUnit 测试库实现到一个 .NET 单元测试项目中。

我已经做到了这一点:

MVC 控制器

private IHOLService _service;

public PolicyController(IHOLService service)
{
      _service = service;
}

public ActionResult Index()
{
     var policies = _service.GetAllPolicies(100, 0).ToList();

     return View(policies);
}

单元测试类

[Fact]
 public void GetPolicies()
 {
            // Arrange
            var mockService = new Mock<IHOLService>();
            List<Policy> policy = new List<Policy>()
            mockService.Setup(cr => cr.GetAllPolicies(10, 0)).Returns(policy);
            var controller = new PolicyController(mockService.Object);

            // policy here contains 0 results.

             // Act
        var result = (ViewResult)controller.Index();

        var model = result.ViewData.Model; // equals 0.

        // Assert
        var listCategories = Assert.IsAssignableFrom<List<Policy>>(result.ViewData.Model);

         // listCategories.Count equals 0 results.

        Assert.Equal(10, listCategories.Count); // Thus always fails
  }

我的问题是,当直接调用Controller时,一切正常,加载了100条策略。

但是,当我运行测试时,加载了 0 个产品,我猜测其中的模拟调用存在问题,可能与服务初始化有关。有没有人以前有过这种情况并可以提供建议?

另外,我是否正确测试我的服务,而不是我在数据层保存的存储库?

提前致谢。

4

1 回答 1

2

在您的测试代码中,您初始化policy为一个空列表,然后告诉您的模拟服务返回这个空列表。要制定测试负载策略,您需要将一些策略实例放入您的policy列表中。

我会写一个看起来像这样的测试:

[Fact]
public void GetPolicies()
{
   // Arrange
   var mockService = new Mock<IHOLService>();
   Policy expectedPolicy = new Policy(); // substitute for the real way you construct these
   List<Policy> policy = new List<Policy>() { expectedPolicy };
   mockService.Setup(cr => cr.GetAllPolicies(10, 0)).Returns(policy);

   // Act
   var result = (ViewResult)controller.Index();

   var model = result.ViewData.Model; // equals 0.

   // Assert
   var listCategories = Assert.IsAssignableFrom<List<Policy>>(result.ViewData.Model);

   Assert.Equal(expectedPolicy, listCategories.First());        
}

但这实际上取决于您尝试对代码的哪个方面进行单元测试。据我所见,此测试只是确认您正在按预期存储策略对象。您可以为依赖于 Policy 实例本身的任何逻辑编写进一步的测试。

于 2012-11-19T09:57:20.220 回答