我有一个方法可以为字典分配一些值,在我的Moq测试中,我想确保使用一组特定的参数(即字符串)来调用 。
我尝试过各种各样的东西 - Setup,SetupSet,VerifySet等。他们都让我确保用我想要的参数调用一个方法,这很好。但是我如何验证它没有被其他任何东西调用?以上方法均无法捕捉到这种情况。
我尝试使用It.IsInRange来指定哪些参数可以正常,但是只接受整数,因此对于字典查找没什么用处。
谢谢,
亚历
答案 0 :(得分:10)
_mockChef.Verify(chef => chef.Bake(It.Is<CakeFlavors>(vetoArgsPredicate), It.IsAny<bool>()), Times.Never());
您可以使用名为It.Is<T>(predicate)
的参数约束和一个对无效参数求值为true的方法,并将其与Times.Never()结合使用。
OR
你可以严格嘲笑,这里的另一个答案就是证明;但它们往往使你的测试变得脆弱。因此,除非你绝对需要它们,否则不鼓励使用它们。
有关详细信息,请参阅项目符号#5和#9 here
答案 1 :(得分:3)
你可以通过严格的模拟来做到这一点,虽然不是严格的AAA(因为没有Assert部分,松散的模拟更强大)会捕获你不想要的其他变体。
只需在模拟中使用MockBehavior.Strict
。
public interface IFoo
{
void Foo(string arg);
}
public class Bar
{
public void CallFoo(IFoo f)
{
f.Foo("hello");
f.Foo("bar"); // Moq will throw an exception on this call
}
}
[Test]
public void ss()
{
var bar = new Bar();
var foo = new Mock<IFoo>(MockBehavior.Strict);
foo.Setup(x => x.Foo("hello"));
bar.CallFoo(foo.Object); //Will fail here because "bar" was not expected
}
答案 2 :(得分:2)
另一种可能性是使用将参数存储在列表或其他内容中的回调。然后你可以在结尾断言列表看起来像你期望的那样。通过这种方式,您可以保留AAA模式。