我不确定这是否有公认的“当前智慧”,但这是我的 2 美分。
首先,正如@codebox 指出的那样,为每个单元测试重新创建模拟是一个好主意,因为您希望单元测试彼此独立运行。否则会导致测试在一起运行时通过,但在单独运行时失败(反之亦然)。创建测试所需的模拟通常在测试设置中完成([SetUp]
在 NUnit 中,在 XUnit 中的构造函数),因此每个测试都会获得一个新创建的模拟。
在配置这些模拟方面,这取决于情况和您的测试方式。我的偏好是在每次测试中使用最少的必要配置来配置它们。这是准确传达测试对其依赖项的要求的好方法。在这些情况下,一些重复并没有错。
如果多个测试需要相同的配置,我会考虑使用基于场景的测试夹具 (链接免责声明:无耻的自我推销)。场景可能类似于When_the_service_is_unavailable
,并且该场景的设置可以配置模拟服务以引发异常或返回错误代码。然后,每个测试都会根据该常见配置/场景做出断言(例如,应该显示错误消息,应该向管理员发送电子邮件等)。
如果您有很多重复的配置位,另一种选择是使用Test Data Builder。这为您提供了可重用的方式来配置模拟或其他任何其他测试数据的许多不同方面。
最后,如果您发现需要大量配置,则可能值得考虑将测试依赖项的接口更改为不那么“健谈”。通过寻找一个有效的抽象来减少被测类所需的调用次数,您将在测试中配置更少,并且很好地封装了该类所依赖的职责。
值得尝试几种不同的方法,看看哪种方法适合你。任何重复的删除都需要与保持每个测试用例独立、简单、可维护和可靠进行平衡。如果您发现大量测试因小的更改而失败,或者您无法确定单个测试所需的配置,或者如果测试失败取决于它们的运行顺序,那么您将需要完善你的方法。