要验证方法是否已被调用,我们应该使此方法可以验证:
// 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();
但它有一个缺点:实际验证的内容并不明显。所以我正在寻找其他选择。
答案 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"));
这减少了复制方法参数的可能性,但它确实具有允许该类型的任何参数匹配的副作用。
同样冒着听起来像个白痴的风险,我想指出一个单元测试永远不会那么复杂,你无法阅读它。如果您发现自己在许多单元测试中使用相同的代码,则应重构测试以使其更小且更易读。