问题描述
在过去,我只用犀牛嘲笑,具有典型的严格模拟。我现在用起订量工作的一个项目,我想知道正确的使用方法。
In the past, I have only used Rhino Mocks, with the typical strict mock. I am now working with Moq on a project and I am wondering about the proper usage.
让我们假设我有一个方法吧对象美孚其上调用百事达的方法。对象巴兹
Let's assume that I have an object Foo with method Bar which calls a Bizz method on object Buzz.
在我的测试,我想验证百事达是所谓的,所以我觉得有两种可能的选择:
In my test, I want to verify that Bizz is called, therefore I feel there are two possible options:
通过严格的模拟
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
是否有这样做的一个标准或正常的方式?
Is there a standard or normal way of doing this?
推荐答案
我以前用严格的嘲笑时,我第一次在单元测试中使用模拟考试开始。这并没有持续很长时间。实际上有2个原因,为什么我不再做这样的:
I used to use strict mocks when I first starting using mocks in unit tests. This didn't last very long. There are really 2 reasons why I stopped doing this:
- 测试变脆 - 凭借严格的嘲笑您声称不止一件事,那设置方法被调用,而其他方法都不会被调用。当你重构代码的测试经常出现故障,即使你正在尝试测试仍然是正确
- 测试更难读 - 你需要对每一个方法的设置是被称为在模拟,即使它没有真正涉及到要测试的内容。当有人读这个测试就很难让他们分不清什么是测试重要的,什么是公正实施的副作用。
由于这些我会强烈建议在单元测试中使用宽松的嘲笑。
Because of these I would strongly recommend using loose mocks in your unit tests.
这篇关于起订量,严格VS宽松的用法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!