单元测试 – 您是否应该在单元测试中使用Moq提供的“Verify”和“VerifyAll”方法?

似乎使用它们作为一种方法来确定被测方法是否正确执行会产生反作用,因为它会导致脆弱的测试.换句话说,你将测试与实现联系在一起.因此,如果您以后想要更改实现,那么您还必须更改测试.我问这个问题是因为我接受过训练,在每次单元测试中总是至少使用其中一种方法,我想我可能只是顿悟了这实际上是一种非常糟糕的做法.
最佳答案
基于模拟的测试

关于单元测试中模拟的脆弱性以及它们是否是好事,存在很多争论.我个人认为这是在可维护性和稳健性之间必须做出的权衡.您将生产代码放在unit test pressure下的越多,使用模拟单独测试它,实现的次数越少,测试就越少.因此,您可以强制您的生产代码具有稳健性和良好的设计.另一方面,它确实将自己绑定到特定实现并增加了维护负担,因为一旦实现细节发生更改,就必须更改更多测试.

VerifyAll()语法

这主要是品味问题,但我发现VerifyAll()并非意图揭示,即当您阅读测试套件时,您只希望通过查看断言来了解规范,而VerifyAll()不会意思是什么.即使我编写基于模拟的测试,我更喜欢Arrange Act Assert方法和特定的断言失败消息.它比一个全能的VerifyAll()调用更清晰,更不“神奇”.

在每个测试方法中使用VerifyAll()

它最多是矫枉过正,最坏的情况会对您的测试套件造成损害.

>作为一般规则,单元测试应该只测试一件事.除了正常的断言之外,系统地调用VerifyAll()会带来混乱 – 如果测试失败,你无法确定出现了什么问题.
>就可读性而言,您只是在每个测试中添加噪声.通过阅读测试方法来追溯验证VerifyAll()的真正含义是非常困难的.
>您通常希望选择使用模拟对您的实施施加设计压力的位置,而不是盲目地在任何地方应用它,因为它有维护价格.

因此,如果你真的必须使用VerifyAll(),最好为它IMO编写单独的测试.

转载注明原文:单元测试 – 您是否应该在单元测试中使用Moq提供的“Verify”和“VerifyAll”方法? - 代码日志