在Moq中VerifyAll()的目的是什么?

时间:2010-09-15 09:59:05

标签: unit-testing moq

我在What is the purpose of Verifiable() in Moq?阅读了这个问题并在脑海中提出了这个问题。需要你的帮助解释一下。

2 个答案:

答案 0 :(得分:45)

VerifyAll()用于验证是否已满足所有期望。 假设你有:

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

HTH

答案 1 :(得分:5)

我将尝试完成@ema的回答,可能会为读者提供更多见解。假设您有模拟对象,该对象是 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();

您将在这里测试什么?您将测试您的设置方法是否被调用。在这种情况下,如果未调用Foo.Eat() or Foo.Bark()中的任何一个,则将导致异常,并且测试将失败。因此,实际上,您混合安排和声明步骤。另外,您无法检查它被调用了多少次,可以使用.Verify(假设您在Param函数中有一些名为Name的参数Eat()拥有该属性) :

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