起订量,严格与宽松使用

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:

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

因此,我强烈建议您在单元测试中使用松散的模拟.

Because of these I would strongly recommend using loose mocks in your unit tests.

这篇关于起订量,严格与宽松使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How to MOQ an Indexed property(如何最小起订量索引属性)
Mocking generic methods in Moq without specifying T(在 Moq 中模拟泛型方法而不指定 T)
How Moles Isolation framework is implemented?(Moles Isolation 框架是如何实现的?)
Difference between Dependency Injection and Mocking Framework (Ninject vs RhinoMocks or Moq)(依赖注入和模拟框架之间的区别(Ninject vs RhinoMocks 或 Moq))
How to mock Controller.User using moq(如何使用 moq 模拟 Controller.User)
How do I mock a class without an interface?(如何模拟没有接口的类?)