我在What is the purpose of Verifiable() in Moq?阅读了这个问题并在脑海中提出了这个问题。需要你的帮助解释一下。
答案 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);