起订量中 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() 的用途是啥?的主要内容,如果未能解决你的问题,请参考以下文章