MOQ - проверить, что метод вызывается только с конкретными параметрами - PullRequest
1 голос
/ 05 апреля 2011

У меня есть метод, который присваивает некоторым значениям словарь, и в моем тесте Moq я хочу убедиться, что он only вызывается с определенным набором параметров (т. Е. Строк).

Я пробовал разные вещи - Setup, SetupSet, VerifySet и т. Д. Все они позволяют мне гарантировать, что метод вызывается с параметрами, которые я хочу, и это хорошо.Но как я могу убедиться, что он не был вызван ни с чем другим?Ни один из вышеперечисленных методов не уловит этот сценарий.

Я пытался использовать It.IsInRange, чтобы указать, какие параметры были в порядке, но он принимает только целые числа, так что для поиска по словарю это не очень полезно.* Спасибо,

Алекс

Ответы [ 3 ]

10 голосов
/ 06 апреля 2011

_mockChef.Verify(chef => chef.Bake(It.Is<CakeFlavors>(vetoArgsPredicate), It.IsAny<bool>()), Times.Never());

Вы можете использовать Argument Constraints aka It.Is<T>(predicate) с методом, который оценивается как true для недопустимых аргументов, и объединить его с Times.Never ().

ИЛИ
Вы могли бы строгие насмешки, как показывает другой ответ;но они имеют тенденцию делать ваши тесты хрупкими.Поэтому их использование не рекомендуется, если они вам абсолютно не нужны.

Подробнее см. В пунктах № 5 и № 9 здесь

3 голосов
/ 06 апреля 2011

Вы можете сделать это с помощью строгого макета, но не строго AAA (так как нет части Assert, а Loose mocking более устойчив), вы поймете другие варианты, которые вам не нужны.

Просто используйте 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 голосов
/ 06 апреля 2011

Другая возможность - использовать обратный вызов, сохраняющий параметр в списке или что-то еще. Затем вы можете утверждать, что список выглядит так, как вы ожидали. Таким образом, вы можете сохранить шаблон AAA.

...