【问题标题】:.NET Unit Testing - Moq/xUnit frameworks with MVC, not returning expected results.NET 单元测试 - 使用 MVC 的 Moq/xUnit 框架,不返回预期结果
【发布时间】:2012-11-19 18:16:31
【问题描述】:

这是我的场景:

我正在处理一个 .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 个产品,我猜测其中某个地方的模拟调用存在问题,可能与服务初始化有关。有没有人有过这种情况并可以提供建议?

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

提前致谢。

【问题讨论】:

    标签: c# .net moq xunit.net


    【解决方案1】:

    在您的测试代码中,您将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 实例本身的任何逻辑编写进一步的测试。

    【讨论】:

    • 也许我看错了,所以你会在代码中创建一组测试对象,比如 100 个随机对象,然后将它们加载到 .Setup 中并针对这些对象进行测试?我猜想 .Returns 将意味着它将 .GetAllPolicies() 的结果加载到该对象中。
    • 我实际上已经更新了我的问题,更多关于单元测试的内容,最后一部分。根据您的输入,我猜这更多地与问题所在的 Controller 调用有关,因为它没有返回任何结果?
    • 是的 - 创建你想在测试中返回的对象,Returns 只是返回你告诉它的实例。永远不会调用真正的 GetAllPolicies。
    • 这很好,但是你能看到控制器方面的问题吗?我认为这是证明我存在问题的部分。
    • 我猜这与: var controller = new PolicyController(mockService.Object);但不知道为什么。
    猜你喜欢
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 2020-01-31
    相关资源
    最近更新 更多