Убедитесь, что метод с определенными параметрами не был вызван с использованием TypeMock - PullRequest
1 голос
/ 17 августа 2011

Я использую Typemock для некоторых моих модульных тестов. Я высмеял статический класс Widget. Я хочу посмеяться над возвращением Widget.GetPrice (123) для возврата значения A.

Isolate.Fake.StaticMethods<Widget>();
Isolate.WhenCalled(() => Widget.GetPrice(123)).WillReturn("A");

Я также хочу убедиться, что Widget.GetPrice (456) НЕ был вызван.

Isolate.Verify.WasNotCalled(() => Widget.GetPrice(456));

Похоже, что WasNotCalled не учитывает параметры. Тест возвращается, говоря, что он потерпел неудачу, потому что Widget.GetPrice был вызван.

Единственный способ, которым я мог бы подумать, это сделать вызов DoInstead и увеличить счетчик при вызове Widget.GetPrice (456). Конец теста проверит, увеличился ли счетчик. Есть ли лучший способ сделать это, хотя?

Ответы [ 2 ]

3 голосов
/ 17 августа 2011

Есть несколько способов сделать это.

Во-первых, ваша идея DoInstead довольно хороша, но я бы настроил ее так, чтобы она содержала утверждение:

Isolate.WhenCalled(() => Widget.GetPrice(0)).DoInstead(
  context =>
  {
    var num = (int)context.Parameters[0];
    Assert.AreNotEqual(456, num);
    return "A";
  });

Идеяесть то, что при вызове метода вы проверяете во время вызова, что входящий параметр соответствует ожидаемому вами, и проваливаете тест с помощью оператора Assert, если это не так.

(Вы также заметите, что яв качестве параметра укажите «0», потому что, как вы заметили, фактическое значение не имеет значения. Я считаю, что для будущего обслуживания проще использовать нуль / 0 / и т. д., когда параметры не имеют значения, поэтому вы не забываете«или« обмануть себя », думая, что это имеет значение.)

Второе, что вы можете сделать, это использовать WithExactArguments для управления поведением.

// Provide some default behavior that will break things
// if the wrong value comes in.
Isolate
  .WhenCalled(() => Widget.GetPrice(0))
  .WillThrow(new InvalidOperationException());

// Now specify the right behavior if the arguments match.
Isolate
  .WhenCalled(() => Widget.GetPrice(123))
  .WithExactArguments()
  .WillReturn("A");

« WithExactArguments »сделает вашПоведение запускаем только , если аргументы совпадают.Когда вы запускаете тест, если передается недопустимое значение, генерируется исключение и тест завершается неудачей.

В любом случае, вы в конечном итоге скорее используете часть вещей WhenCalled для обработки вашего утверждения.чем "Подтвердить" вызов.

2 голосов
/ 28 февраля 2016

Отказ от ответственности, я работаю в Typemock.

Поскольку наш API постоянно совершенствуется, найдите другое решение для вашей проблемы.Вы можете использовать

Isolate.WhenCalled((<type arg1>, <type arg1>) => fake<method> (<arg1>, <arg2>)).AndArgumentsMatch((<arg1>, <arg2>) => <check>.<behavior>;

для установки своего поведения для аргументов, которые вы хотите.

Кроме того, не нужно создавать никаких исключений.Используйте DoInstead (), как показано ниже, чтобы проверить, какой метод не был вызван с точными аргументами.Внутреннее утверждение не требуется.

[TestMethod, Isolated]
public void TestWidget()
{
    Isolate.WhenCalled((int n) => Widget.GetPrice(n)).AndArgumentsMatch((n) => n == 123).WillReturn("A");

    bool wasCalledWith456 = false;

    Isolate.WhenCalled(() => Widget.GetPrice(456)).WithExactArguments().DoInstead((context) =>
    {
        wasCalledWith456 = true;
        context.WillCallOriginal();
        return null;
    });

    Assert.AreEqual("A", Widget.GetPrice(123));
    Widget.GetPrice(234);
    Widget.GetPrice(345);
    Widget.GetPrice(456);

    Assert.IsFalse(wasCalledWith456);
}
...