Sea*_*eau 5 unit-testing mocking
我目前正在利用Mock对象扩展我的单元测试(在这种特殊情况下为nSubsitute).但是我想知道创建Mock对象时当前的智慧.例如,我正在处理一个包含各种例程的对象来获取和处理数据 - 这里没什么大不了的,但它将在相当多的测试中使用.
我是否应该创建一个共享函数来返回Mock对象,其中包含针对大多数Testing项目模拟的所有适当方法和行为,并将该对象调用到我的单元测试中?或者我应该将对象模拟到每个单元测试中,只模拟我测试所需的行为(尽管有时候我会不止一次地嘲笑相同的行为).
感激地收到了想法或建议......
我不确定是否有一个商定的"当前智慧",但这是我的2美分.
首先,正如@codebox指出的那样,为每个单元测试重新创建模拟是一个好主意,因为您希望单元测试彼此独立运行.否则可能导致测试在一起运行时通过但在单独运行时失败(反之亦然).创建测试所需的[SetUp]模拟通常在测试设置中完成(在NUnit中,在XUnit中的构造函数中),因此每个测试都将获得一个新创建的模拟.
在配置这些模拟方面,它取决于具体情况和测试方式.我的偏好是在每次测试中配置它们,只需要最少量的配置.这是一种很好的方式来准确地传达测试所需的依赖项.在这些情况下,一些重复没有错.
如果许多测试需要相同的配置,我会考虑使用基于场景的测试夹具 (链接免责声明:无耻的自我推销).方案可能类似于When_the_service_is_unavailable,并且该方案的设置可以将模拟的服务配置为抛出异常或返回错误代码.然后,每个测试基于该公共配置/场景进行断言(例如,应该显示错误消息,应该向管理员发送电子邮件等).
如果您有大量重复的配置,另一个选择是使用测试数据生成器.这为您提供了可重用的方法来配置模拟或其他任何其他测试数据的许多不同方面.
最后,如果您发现需要大量配置,则可能值得考虑将测试依赖关系的界面更改为"健谈".通过查找有效的抽象来减少被测试类所需的调用次数,您将在测试中配置较少,并且可以很好地封装该类所依赖的职责.
值得尝试一些不同的方法,看看什么对你有用.任何删除重复都需要保持平衡,同时保持每个测试用例独立,简单,可维护和可靠.如果您发现大量测试因较小的更改而失败,或者您无法确定单个测试需要的配置,或者测试失败取决于它们的运行顺序,那么您将需要改进你的方法.
| 归档时间: |
|
| 查看次数: |
4332 次 |
| 最近记录: |