起订量中 VerifyAll() 的用途是啥?

Posted

技术标签:

【中文标题】起订量中 VerifyAll() 的用途是啥?【英文标题】:What is the purpose of VerifyAll() in Moq?起订量中 VerifyAll() 的用途是什么? 【发布时间】:2011-04-12 14:34:29 【问题描述】:

我在What is the purpose of Verifiable() in Moq? 阅读了这个问题,并在脑海中浮现了这个问题:

VerifyAll() 在 Moq 中的用途是什么?

【问题讨论】:

请记住,您不应该在 Arrange 中堆叠断言。你应该断言。因此,不要使用 Verify 或 VerifyAll - 这是错误的思考方式。 ***.com/questions/980554/… 【参考方案1】:

VerifyAll() 用于验证所有的期望都是我的。假设你有:

myMock.Setup(m => m.DoSomething()).Returns(1);
mySut.Do();
myMock.VerifyAll(); // Fail if DoSomething was not called

【讨论】:

这并不能很好地说明 V 和 VA 之间的差异(这是 OP 要求的),是吗? 当您可以使用 AAA 语法并且不需要在模拟对象上设置期望时,您使用验证。【参考方案2】:

我会尽量完成@ema's answer,也许它会给读者更多的见解。假设您有 mocked 对象,它是您的 sut 的依赖项。假设它有两种方法,并且您想要设置它们以便不会出现任何异常或为您的 sut 创建各种场景:

var fooMock = new Mock<Foo>();
fooMock.Setup(f => f.Eat()).Returns("string");
fooMock.Setup(f => f.Bark()).Returns(10);

_sut = new Bar(fooMock.Object);

这就是安排步骤。现在你想运行一些你想实际测试的方法(现在你行动):

_sut.Test();

现在你将断言VerifyAll()

fooMock.VerifyAll();

您将在这里测试什么?您将测试您的 setup 方法是否被调用。在这种情况下,如果 Foo.Eat()Foo.Bark() 没有被调用,您将得到一个异常并且测试将失败。所以,实际上,你混合安排和断言步骤。此外,您无法检查它被调用了多少次,您可以使用 .Verify() 来执行此操作(假设您的 Eat() 函数中有一些参数 Param 具有名为 Name 的属性):

fooMock.Verify(f => f.Eat(It.Is<Param>(p => p.Name == "name")), Times.Once);

【讨论】:

不过,这完全破坏了命令查询分离

以上是关于起订量中 VerifyAll() 的用途是啥?的主要内容,如果未能解决你的问题,请参考以下文章

最小起订量中的设置序列

起订量 IServiceProvider / IServiceScope

带参数的起订量 ReturnsAsync()

使用最小起订量模拟静态属性

未找到统一起订量

起订量,严格与宽松的使用