Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 我应该什么时候删除mock?_Unit Testing - Fatal编程技术网

Unit testing 我应该什么时候删除mock?

Unit testing 我应该什么时候删除mock?,unit-testing,Unit Testing,以前,当依赖接口的实现不可用时,我在TDD(测试驱动开发)中使用了mock。所以我模仿了这些依赖关系并测试了我的工作 现在可以使用依赖项的实现。那么,我应该删除mock还是将它们转换为spy或类似的?我认为集成测试只能在删除这些模拟之后进行,否则我可能不得不复制它们。我有点困惑,有什么建议吗?一如既往:视情况而定 如果您使用的是mock,那么您将针对定义的接口进行测试,因此您的单元测试将更加集中,并且测试中的破坏性更改可能会更少(例如,当内部需要重构时) 如果您使用的是实际的依赖项,那么您的单元

以前,当依赖接口的实现不可用时,我在TDD(测试驱动开发)中使用了mock。所以我模仿了这些依赖关系并测试了我的工作

现在可以使用依赖项的实现。那么,我应该删除mock还是将它们转换为spy或类似的?我认为集成测试只能在删除这些模拟之后进行,否则我可能不得不复制它们。我有点困惑,有什么建议吗?

一如既往:视情况而定

如果您使用的是mock,那么您将针对定义的接口进行测试,因此您的单元测试将更加集中,并且测试中的破坏性更改可能会更少(例如,当内部需要重构时)


如果您使用的是实际的依赖项,那么您的单元测试就没有那么集中(它们可能是集成测试)。因此,这些测试通常速度较慢,设置起来更困难,重构时更容易中断。另一方面,由于您是针对实际实现进行测试,您更有可能发现错误,因为实际实现的行为与您预期的不同。

就单元测试而言-从不。通常是因为您希望保持单元测试的隔离:

  • 您的单元测试(就像任何其他类一样)通常只有一个更改/中断的原因。当错误发生时,您希望将可能的违规者数量减少到绝对最小。由于某些依赖项可能失败,或者其他依赖项可能失败,或者最终实际测试的类可能失败而导致单元测试失败是不可接受的
实际上,这是一个很大的难题,因为即使更改依赖项的接口,也会导致使用此依赖项的类的单元测试发生变化。你想要避免的是,来自其他团队的某个人改变了你正在使用的依赖项的实现,结果你的测试失败了,显然是没有原因的。这也是非常不可取的


模拟应该用来隔离你的单位。当然,在编写不同类型的测试(比如集成)时,您不需要隔离。您需要真正的组件协同工作。这是使用实际实现而不是模拟的原因之一-但是这不会使单元测试无效。它们应该保持孤立。

IMO,模拟是一种平衡行为,我通常模拟更复杂和不确定的接口。我想我明白你的意思了,我应该同时保留“模拟依赖关系的单元测试”和“使用真实对象检查集成的单元测试”。看来我的单元测试代码要加倍了。@RahulKulshreshtha:是的。您需要两种类型的测试。单元-验证低级行为(单元)和集成,以确保类按预期协同工作。集成测试通常会测试更大的进程(例如,是否从数据库中获取实体,是否已解析并保存到其他数据库),而单元测试将单独检查进程的部分(例如,解析器逻辑和边缘情况)。通常不需要删除测试,但可能需要同时删除这两个测试。通过进行单元测试和集成测试,通常更容易找出问题发生的位置。即使您的单元和集成测试基本相同,这也是正确的,只是您在其中一个测试中使用mock,而在另一个测试中不使用mock。