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

本文关键字:对象 单元测试 真实 模拟 | 更新日期: 2023-09-27 17:56:07

下面是我的单元测试方法(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. 初始化 _productService 时,注入您正在设置的_productDalMock。这通常在初始化_productDalMock实例之后,在 _productService 的构造函数中完成。

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

如果您确保上述 2 个步骤,则退回的实际产品应与您通过的产品相同。