C# 如何使用最小起订量使所有方法都可验证

C# 如何使用最小起订量使所有方法都可验证,c#,unit-testing,nunit,moq,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")); 我想避免这个重复的

要验证调用了该方法,我们应使该方法可验证:

// arrange
mock
    .Setup(foo => foo.SomeMethod("param1", "param2", "param3", "param4"))
    .Verifiable();
然后我们可以这样做:

// assert
mock
    .Verify(foo => foo.SomeMethod("param1", "param2", "param3", "param4"));
我想避免这个重复的代码。。。在复杂测试的情况下,代码会过载且无法读取

所以我的问题是,如何在arrange部分中使所有方法(具有任何参数)都是可验证的

注 我知道
VerifyAll()


但它也有一个缺点:实际验证的内容并不明显。因此,我正在寻找一些替代方案。

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

var factory=newmockfactory(MockBehavior.Strict){DefaultValue=DefaultValue.Mock};
var fooMock=factory.Create();
var barMock=factory.Create();
//验证通过工厂创建的所有模拟的所有可验证预期
factory.Verify();
编辑


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

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

var factory=newmockfactory(MockBehavior.Strict){DefaultValue=DefaultValue.Mock};
var fooMock=factory.Create();
var barMock=factory.Create();
//验证通过工厂创建的所有模拟的所有可验证预期
factory.Verify();
编辑


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

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

e、 g

mock.Setup(foo=>foo.SomeMethod(It.IsAny()、It.IsAny()、It.IsAny()、It.IsAny());
//表演。。。
mock.Verify(foo=>foo.SomeMethod(“param1”、“param2”、“param3”、“param4”);
这减少了复制方法参数的可能性,但它确实有一个副作用,即允许该类型的任何参数匹配


同样冒着听起来像个白痴的风险,我想指出,单元测试永远不应该如此复杂,以至于你看不懂它。如果您发现自己在许多单元测试中使用相同的代码,您应该重构测试,使其更小、更可读。

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

e、 g

mock.Setup(foo=>foo.SomeMethod(It.IsAny()、It.IsAny()、It.IsAny()、It.IsAny());
//表演。。。
mock.Verify(foo=>foo.SomeMethod(“param1”、“param2”、“param3”、“param4”);
这减少了复制方法参数的可能性,但它确实有一个副作用,即允许该类型的任何参数匹配


同样冒着听起来像个白痴的风险,我想指出,单元测试永远不应该如此复杂,以至于你看不懂它。如果您发现自己在许多单元测试中使用相同的代码,您应该重构测试,使其更小、更可读。

我不想全部验证,因为实际验证的内容并不明显。我能用这种方法用一些特定的参数验证一些特定的方法吗?@wishmaster:在你的例子中,你甚至可以避免使用设置,因为你没有设置任何东西,不需要将它标记为可验证的。简而言之:删除设置并保留验证。我不想全部验证,因为实际验证的内容不明显。我能用这种方法用一些特定的参数验证一些特定的方法吗?@wishmaster:在你的例子中,你甚至可以避免使用设置,因为你没有设置任何东西,不需要将它标记为可验证的。简而言之:删除设置并保留验证。不需要排列部件。不需要排列部件。
// assert
mock.VerifyAll();
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();
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"));