什么是严格和非严格的嘲笑?

San*_*box 14 unit-testing moq mocking

我已经开始使用moq进行模拟.有人能解释我严格和非严格嘲笑的概念吗?它们如何在moq中使用?

编辑: 我们在哪种情况下使用哪种类型的模拟?

Mar*_*off 13

我不确定moq具体,但这里是严格的模拟在Rhino中工作的方式.我声明我希望foo.Bar对我的对象进行调用foo:

foo.Expect(f => f.Bar()).Returns(5);
Run Code Online (Sandbox Code Playgroud)

如果调用代码

foo.Bar();
Run Code Online (Sandbox Code Playgroud)

那我很好,因为期望得到了完全满足.

但是,如果调用代码是:

foo.Quux(12);
foo.Bar();
Run Code Online (Sandbox Code Playgroud)

然后我的期望失败了,因为我没有明确期望打电话foo.Quux.

总而言之,如果有任何不同于预期的情况,严格的模拟将立即失败.在另一方面,非严格模拟(或存根)会很高兴地"忽略"的号召,foo.Quux并应返回一个default(T)返回类型Tfoo.Quux.

Rhino的创建者建议您避免使用严格的模拟(并且更喜欢存根),因为您通常不希望在接收到如上所述的意外调用时测试失败.当您必须修复依赖于确切原始行为的数十个测试时,它会使您的代码重构变得更加困难.

  • 你在哪里指定它是一个严格的模拟? (2认同)
  • @Sandbox:您可以在[采用`MockBehavior` 参数的`Mock` 构造函数](http://www.clariusconsulting.net/labs/moq/html/DD4BEE30.htm) 中指定严格或非严格。默认行为(当未指定 `MockBehavior` 时)似乎是非严格的(他们称之为“宽松”)。 (2认同)