Модульный тестовый класс с заглушками. Должен ли я настроить заглушки, чтобы они ВСЕГДА возвращали правильные значения?

это один из моих вопросов о модульном тестировании.

Я читаю Искусство модульного тестирования, и в главе 3 автор показывает, как удалить зависимость между одним или несколькими классами. Это кажется мне ясным. Не совсем ясен следующий момент.

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

Итак, вопрос: когда я использую заглушки, должен ли я ВСЕГДА настраивать их так, чтобы они возвращали ожидаемое значение? По моему мнению, это должен быть правильный способ проверки, как если бы заглушка всегда возвращала ожидаемое значение. Я уверен, что буду проверять только логику внутри тестируемого метода.

Что Вы думаете об этом? Есть ли какой-то случай, в котором есть какой-то смысл обязать заглушку возвращать неверные значения?

Большое спасибо, Марко


person Marconline    schedule 08.01.2012    source источник


Ответы (2)


Вы проверяете, как работает sut (тестируемая система) в нескольких условиях:

  • хороший путь = настройка заглушек для возврата хороших значений и проверка соответствующего поведения sut
  • печальный путь(-и) = настроить заглушки с неправильными значениями и убедиться, что sut может обрабатывать такие случаи (например, вы можете проверить, генерирует ли он исключение, используя атрибут ExpectedException, если вы используете nUnit)
person Cristian Lupascu    schedule 08.01.2012
comment
О, вот ответ, который я хотел бы получить! Большое спасибо! - person Marconline; 08.01.2012
comment
У меня есть еще один вопрос: предположим, у меня есть заглушка, которая возвращает True, если файл имеет расширение «ext», иначе false. Мой тестируемый метод вызывает этот метод с допустимым расширением, но заглушка настроена на возврат false (т. е. мы тестируем печальный путь). Что я должен сделать, чтобы улучшить свой метод и пройти тест? Единственное решение, которое я вижу, это не доверять заглушке, но... Это правильно? - person Marconline; 08.01.2012
comment
Класс, возвращающий true/false в зависимости от расширения (назовем его ExtensionValidator), — еще один системный компонент. Эта логика будет проверена в другом месте (в ExtensionValidatorTests). В нашем текущем контексте мы тестируем sut, и на данный момент ExtensionValidator — это просто заглушка, которая будет возвращать любое значение, которое мы ему прикажем. Таким образом, true/false в зависимости от логики расширения не нужно проверять в нашем текущем контексте. Пожалуйста, дайте мне знать, если это отвечает на ваш вопрос. - person Cristian Lupascu; 08.01.2012
comment
Да, это ответ на мой вопрос, но в книге есть пример, который, на мой взгляд, не так прост для понимания. Кстати, книга крутая! Большое спасибо, w0lf! - person Marconline; 09.01.2012

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

person Damyan Bogoev    schedule 08.01.2012