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

Nam*_* VU 44 unit-testing moq

在Moq看到了Verifiable()的目的是什么?在我的脑海里有这个问题.需要你的帮助解释一下.

ema*_*ema 47

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

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

HTH

  • 这并没有很好地说明V和VA之间的差异(这是OP要求的),是吗? (23认同)
  • 当您可以使用AAA语法并且不需要在模拟对象上设置期望时,可以使用Verify. (2认同)

Ole*_*egI 13

我将尝试完成@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);
Run Code Online (Sandbox Code Playgroud)

这就是安排步骤。现在,您要运行一些要实际测试的方法(现在执行):

_sut.Test();
Run Code Online (Sandbox Code Playgroud)

现在,您将断言VerifyAll()

fooMock.VerifyAll();
Run Code Online (Sandbox Code Playgroud)

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

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

  • @O'Rooney,这是您正在为其编写单元测试的对象。它可以翻译为“System Under Test”,这是一个很常见的命名约定,抱歉不太清楚:) (4认同)
  • 但这完全打破了命令查询分离 (2认同)