【问题标题】:What is the purpose of VerifyAll() in Moq?起订量中 VerifyAll() 的用途是什么?
【发布时间】:2023-03-03 21:25:02
【问题描述】:

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

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

【问题讨论】:

标签: unit-testing moq


【解决方案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);

【讨论】:

  • 不过,这完全破坏了命令查询分离
猜你喜欢
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 2020-03-10
  • 2011-04-01
  • 2020-12-17
  • 2015-09-12
  • 1970-01-01
相关资源
最近更新 更多