MOQ - 检查仅使用特定参数调用方法

时间:2011-04-05 17:11:07

标签: unit-testing syntax moq

我有一个方法可以为字典分配一些值,在我的Moq测试中,我想确保使用一组特定的参数(即字符串)来调用

我尝试过各种各样的东西 - Setup,SetupSet,VerifySet等。他们都让我确保用我想要的参数调用一个方法,这很好。但是我如何验证它没有被其他任何东西调用?以上方法均无法捕捉到这种情况。

我尝试使用It.IsInRange来指定哪些参数可以正常,但是只接受整数,因此对于字典查找没什么用处。

谢谢,

亚历

3 个答案:

答案 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模式。