c# - 最小起订量,严格与宽松的用法

标签 c# .net unit-testing mocking moq

过去,我只使用过 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。这并没有持续很长时间。我停止这样做的真正原因有两个:

  1. 测试变得脆弱 - 使用严格的模拟,您断言不止一件事,调用设置方法,并且不调用其他方法。当您重构代码时,测试通常会失败,即使您尝试测试的内容仍然正确。
  2. 测试更难阅读 - 您需要为模拟中调用的每个方法设置一个设置,即使它与您要测试的内容并不真正相关。当有人阅读这个测试时,他们很难说出什么对测试很重要,什么只是实现的副作用。

由于这些原因,我强烈建议您在单元测试中使用松散模拟。

关于c# - 最小起订量,严格与宽松的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4996327/

相关文章:

c# - 数据绑定(bind)到 WPF 中的文本框

c# - 同步从 Unet/Unity 5 中的另一个可交互对象更改的非玩家对象转换?

c# - RavenDB 搜索多个单词

c# - KeyDown 事件不是从网格中引发的

.net - 需要 : File system interfaces and implementation in . NET

c# - 如何获得 "200 OK"的 HttpWebResponse?

javascript - 使用 webpack 的 require.ensure 函数为 javascript 模块编写测试

c# - 如何在点击事件中获取 treeView 的节点文本

javascript - Sinon stub 是如何工作的?

c# - 对 ASP.NET 2.0 网页进行单元测试的最佳方法是什么?