过去,我只使用过 Rhino Mocks,具有典型的严格模拟。我现在正在与 Moq 合作进行一个项目,我想知道正确的用法。
假设我有一个带有方法 Bar 的对象 Foo,它调用对象 Buzz 的 Bizz 方法。
在我的测试中,我想验证 Bizz 是否被调用,因此我觉得有两种可能的选择:
严格模拟
var mockBuzz= new Mock<IBuzz>(MockBehavior.Strict);
mockBuzz.Setup(x => x.Bizz()); //test will fail if Bizz method not called
foo.Buzz = mockBuzz
foo.Bar();
mockBuzz.VerifyAll();
用松散的模拟
var mockBuzz= new Mock<IBuzz>();
foo.Buzz = mockBuzz
foo.Bar();
mockBuzz.Verify(x => x.Bizz()) //test will fail if Bizz method not called
是否有标准或正常的方法来执行此操作?
最佳答案
当我第一次开始在单元测试中使用 mock 时,我曾经使用过严格的 mock。这并没有持续很长时间。我停止这样做的真正原因有两个:
- 测试变得脆弱 - 使用严格的模拟,您断言不止一件事,调用设置方法,并且不调用其他方法。当您重构代码时,测试通常会失败,即使您尝试测试的内容仍然正确。
- 测试更难阅读 - 您需要为模拟中调用的每个方法设置一个设置,即使它与您要测试的内容并不真正相关。当有人阅读这个测试时,他们很难说出什么对测试很重要,什么只是实现的副作用。
由于这些原因,我强烈建议您在单元测试中使用松散模拟。
关于c# - 最小起订量,严格与宽松的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4996327/