在单元测试中模拟依赖项有什么好处?

帕万

我正在为控制器和服务层(C#,MVC)进行单元测试。我正在使用Moq dll来模拟单元测试中的真实/依赖对象。

但是我对模拟依赖项或真实对象有点困惑。让我们以下面的单元测试方法为例:

[TestMethod]
public void ShouldReturnDtosWhenCustomersFound_GetCustomers ()
{
    // Arrrange 
    var name = "ricky";
    var description = "this is the test";

    // setup mocked dal to return list of customers
    // when name and description passed to GetCustomers method
    _customerDalMock.Setup(d => d.GetCustomers(name, description)).Returns(_customerList);

    // Act
    List<CustomerDto> actual = _CustomerService.GetCustomers(name, description);

    // Assert
    Assert.IsNotNull(actual);
    Assert.IsTrue(actual.Any());

    // verify all setups of mocked dal were called by service
    _customerDalMock.VerifyAll();
}

在上面的单元测试方法中,我在模拟GetCustomers方法并返回客户列表。哪个已经定义。如下图所示:

List<Customer> _customerList = new List<Customer>
{
    new Customer { CustomerID = 1, Name="Mariya",Description="description"},
    new Customer { CustomerID = 2, Name="Soniya",Description="des"},
    new Customer { CustomerID = 3, Name="Bill",Description="my desc"},
    new Customer { CustomerID = 4, Name="jay",Description="test"},
};

让我们来看看“客户断言”模拟对象和实际对象断言:

Assert.AreEqual(_customer.CustomerID, actual.CustomerID);
Assert.AreEqual(_customer.Name, actual.Name);
Assert.AreEqual(_customer.Description, actual.Description);

但是在这里我不理解它(在单元测试之上)总是可以正常工作。意味着我们只是在测试(通过断言)已通过或正在返回的(在模拟对象中)。而且我们知道实际对象将始终返回我们传递的列表或对象。

那么在这里进行单元测试或模拟是什么意思呢?

dcastro

模拟的真正目的是实现真正的隔离。

假设您有一CustomerService堂课,这取决于CustomerRepository您编写了一些涵盖所提供功能的单元测试CustomerService他们都通过了。

一个月后,进行了一些更改,突然您的CustomerServices单元测试开始失败-您需要查找问题出在哪里。

因此,您假设:

因为测试的单元测试CustomerServices失败,所以问题一定出在该类中!!

正确的?错误的!该问题可能是CustomerServices由于其或取决于其存在的CustomerRepository如果其任何依赖项失败,则被测类也有可能失败。

现在,想象一下巨大的依赖关系链:A依赖BB依赖C,...Y依赖Z如果在中引入了错误Z,则所有单元测试都将失败。

这就是为什么您需要将被测类与其依赖项(可能是域对象,数据库连接,文件资源等)隔离开来。您要测试一个单元

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在单元测试中模拟依赖项

模拟单元测试中的行为。为什么验证方法调用有好处?

从单元测试中注入模拟的Spring @Autowired依赖项的最佳方法是什么?

单元测试:具有构造函数依赖项注入的模拟服务类

我应该模拟单元测试中的每个依赖项吗?

如何在单元测试中从Automapper模拟IValueResolver的依赖项

是否有必要在单元测试中模拟所有依赖关系?

控制器单元测试中的模拟依赖

对具有依赖项的AngularJS工厂进行单元测试

带有 I/O 依赖项的单元测试

具有许多依赖项 Angular 的服务的单元测试

角度如何每次都不导入组件单元测试中的所有依赖项

Angular2 Final中带有提供程序依赖项的隔离单元测试

如何使用在方法中具有依赖项的moq来对类进行单元测试?

验证对单元测试中依赖项的调用?

模拟和单元测试实现依赖

单元测试模拟返回的数据有什么意义?

最佳实践-单元测试依赖项

单元测试依赖项注入

为什么在单元测试中,我们没有模拟域对象?

有什么方法可以模拟结构以在单元测试中获得类?

如何使用mocha.js模拟依赖项类进行单元测试?

使用Nestjs测试模块进行单元测试有什么好处?

如何在单元测试中模拟私有变量?

带有依赖注入的Typescript中的单元测试

如何测试具有由 android 生成的接口依赖项的 ViewModel 类作为单元测试

在单元测试中模拟Executorservice字段

模拟python单元测试中的问题

在grails单元测试中模拟表单