模拟和真实对象中的单元测试差异

时间:2014-04-02 14:44:13

标签: c# unit-testing mocking

以下是我的单元测试方法(c#): -

[TestMethod]
public void ShouldReturnDtosWhenProductsFound_GetProducts()
{
    // Arrrange 
    var count = 0;
    var name = "myproduct";
    var description = "desc";

    // setup mocked dal to return  list of products
    // when name and description passed to GetProducts method
    _productDalMock.Setup(d => d.GetProducts(name, description)).Returns(_productList);

    // Act
    List<ProductDto> actual = _productService.GetProducts(name, description);

    // Assert
    Assert.IsNotNull(actual);
    Assert.IsTrue(actual.Any());
    Assert.AreEqual(_productList.Count, actual.Count);

    foreach (var product in _productList)
    {
        Adapter.AssertAreEqual(product, actual[count]);
        count++;
    }
    // verify all setups of mocked dal were called by service
    _productDalMock.VerifyAll();
}

我使用Mock对象来模拟GetProducts方法(依赖)。在模拟中我返回已经声明的产品列表(_productList)。

我的问题是当我调试测试时,我没有在实际对象中获得与我通过模拟相同的产品列表。根据我的探索,我们将得到实际结果中的相同的对象列表,我们传入模拟对象。

任何人都可以告诉我这里出了什么问题吗?

修改


我只想知道模拟对象必须使用实际对象返回相同的值,还是可以更改?

1 个答案:

答案 0 :(得分:1)

  1. 初始化_productService时,请注入_productDalMock您的设置。在初始化_productService实例后,通常在_productDalMock的构造函数中完成此操作。

    _productService = new ProductService(_productDalMock);
    
  2. 在调试过程中,请验证_productService.GetProducts代码是否最终到达_productDal.GetProducts代码行。即在DAL调用之前没有代码会使_productService.GetProducts方法返回等。

  3. 如果您确保执行上述两个步骤,则返回的实际产品应与您通过的产品相同。