Moq, strict vs loose usage(起订量,严格与宽松使用)
问题描述
在过去,我只使用 Rhino Mocks,具有典型的严格模拟.我现在正在与 Moq 合作开展一个项目,我想知道如何正确使用.
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.
假设我有一个带有方法 Bar 的对象 Foo,它在对象 Buzz 上调用 Bizz 方法.
Let's assume that I have an object Foo with method Bar which calls a Bizz method on object Buzz.
在我的测试中,我想验证是否调用了 Bizz,因此我觉得有两种可能的选择:
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?
推荐答案
当我第一次在单元测试中开始使用 mock 时,我曾经使用严格的 mock.这并没有持续很长时间.我停止这样做的真正原因有两个:
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:
- 测试变得脆弱 - 使用严格的模拟,您断言不止一件事,即调用 setup 方法,并且不调用其他方法.当您重构代码时,测试通常会失败,即使您尝试测试的内容仍然正确.
- 测试更难阅读 - 您需要为模拟中调用的每个方法设置一个设置,即使它与您要测试的内容并不真正相关.当有人阅读此测试时,他们很难说出什么对测试很重要,什么只是实施的副作用.
因此,我强烈建议您在单元测试中使用松散的模拟.
Because of these I would strongly recommend using loose mocks in your unit tests.
这篇关于起订量,严格与宽松使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:起订量,严格与宽松使用


- 输入按键事件处理程序 2022-01-01
- Web Api 中的 Swagger .netcore 3.1,使用 swagger UI 设置日期时间格式 2022-01-01
- 在哪里可以找到使用中的C#/XML文档注释的好例子? 2022-01-01
- 良好实践:如何重用 .csproj 和 .sln 文件来为 CI 创建 2022-01-01
- MoreLinq maxBy vs LINQ max + where 2022-01-01
- 带有服务/守护程序应用程序的 Microsoft Graph CSharp SDK 和 OneDrive for Business - 配额方面返回 null 2022-01-01
- C# 中多线程网络服务器的模式 2022-01-01
- C#MongoDB使用Builders查找派生对象 2022-09-04
- 如何用自己压缩一个 IEnumerable 2022-01-01
- WebMatrix WebSecurity PasswordSalt 2022-01-01