如何用Moq制作可验证的所有方法

时间:2014-09-10 20:38:40

标签: c# unit-testing nunit moq

要验证方法是否已被调用,我们应该使此方法可以验证:

// arrange
mock
    .Setup(foo => foo.SomeMethod("param1", "param2", "param3", "param4"))
    .Verifiable();

然后我们可以这样做:

// assert
mock
    .Verify(foo => foo.SomeMethod("param1", "param2", "param3", "param4"));

我想避免这种重复的代码......如果进行复杂的测试,代码就会变得过载而且不可读。

所以我的问题是如何在安排部分中制作可验证的所有方法(带有任何参数)?

注意

我知道VerifyAll()

// assert
mock.VerifyAll();

但它有一个缺点:实际验证的内容并不明显。所以我正在寻找其他选择。

2 个答案:

答案 0 :(得分:5)

您可以使用模拟工厂(请参阅“自定义模拟行为”here

var factory = new MockFactory(MockBehavior.Strict) { DefaultValue = DefaultValue.Mock };

var fooMock = factory.Create<IFoo>();
var barMock = factory.Create<IBar>();

// Verify all verifiable expectations on all mocks created through the factory
factory.Verify();

修改

在您的示例中,您甚至可以避免使用设置,因为您没有设置任何内容,无需将其标记为可验证。简而言之:删除设置并保持验证

答案 1 :(得分:1)

我不确定这是否是您要查找的内容,但您可以使用It.IsAny<T>来表示“此类型的任何实例”,而不是指定两次相同的参数。

e.g。

mock.Setup(foo => foo.SomeMethod(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()));

//act...

mock.Verify(foo => foo.SomeMethod("param1", "param2", "param3", "param4"));

这减少了复制方法参数的可能性,但它确实具有允许该类型的任何参数匹配的副作用。

同样冒着听起来像个白痴的风险,我想指出一个单元测试永远不会那么复杂,你无法阅读它。如果您发现自己在许多单元测试中使用相同的代码,则应重构测试以使其更小且更易读。