Модульное тестирование то, что ничего не возвращает, как утверждать? - PullRequest
2 голосов
/ 19 мая 2010

Как бы вы утверждали такой код?Каков наилучший подход для этого?

public void doSomething(int myProperty){
    if (myProperty == 0) return;
    // If myProperty is not zero, do something in the method
}

Ответы [ 6 ]

7 голосов
/ 19 мая 2010

Если этот код ничего не возвращает, какова его цель? Что будет не так, если вы удалите эту строку?

Если вы найдете ценный ответ на эти вопросы, вы найдете подсказки для проверки своего кода.

Если вы не нашли ответа, тогда вы можете безопасно удалить строку (и, следовательно, нет теста для записи).

4 голосов
/ 19 мая 2010

Независимо от того, что вы делаете, вам нужно проверить наблюдаемые эффекты . Конечно, ваш метод должен делать что-то .

При использовании тестирования на основе состояния вы можете проверить состояние вашего SUT или Fixture после выполнения метода, чтобы увидеть, соответствует ли состояние ваши ожидания.

Если это невозможно, вам необходимо выполнить Проверка поведения (он же тестирование на основе взаимодействия . Это часто делается с фиктивными объектами .

3 голосов
/ 19 мая 2010

Вы можете утверждать, что все, что происходит после return , не происходит, когда myProperty равно нулю.

Например, если метод (псевдокод!)

if myProperty == 0 return

myOtherProperty = 2

тогда ваш юнит-тест может

  • Упорядочить , чтобы myProperty было установлено на ноль, myOtherProperty установлено на что-то отличное от 2
  • Действуйте , вызывая тестируемый метод
  • Утверждение , что myOtherProperty по-прежнему установлено на то, что было установлено ранее.
1 голос
/ 19 мая 2010

Я думаю, что Марк Симанн дал вам полный ответ - это всего лишь иллюстрация к нему.

SomeVerifiableClass actor;

public void doSomething(int myProperty){
    if (myProperty == 0) return;

    // If myProperty is not zero, do something in the method
    actor.doesSomething(myProperty);
}

Тогда вы можете выбрать SomeVerifiableClass или протестировать с реальным. Если вы используете DI правильно, тогда лучше использовать mocking.

Пересмешивание: проверка поведения (псевдокод):

  verify(mockedActor).noMethodsCalled();

В случае реального объекта вы проверяете состояние:

  assert(isPrestine(actor));

Если в вашем случае нет актера, вы сможете проверить состояние тестируемого объекта (который выполняет doSomething ).

0 голосов
/ 19 мая 2010

Вы не опубликовали сигнатуру метода, поэтому я предполагаю, что она имеет тип void в качестве возвращаемого типа. В этом случае нет способа проверить это, как вы указали; но если метод взаимодействует со свойствами области объекта, вы можете проверить их, чтобы увидеть, изменяются они или нет.

0 голосов
/ 19 мая 2010

Когда я вижу это, я задаю вопрос: что происходит, когда myProperty не равен нулю?

Есть ли код после этого возврата, который изменяет уровень класса / общее состояние? Можете ли вы утверждать против уровня класса / общего состояния, чтобы проверить поведение?

Когда myProperty равен нулю, метод не должен влиять на состояние

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...