Где / что тестировать? Издевается, заглушки, функционал, юнит ... (в Ruby / Rails)? - PullRequest
1 голос
/ 30 июля 2010

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

  • был ли пользователь сохранен (т. Е. Есть ли новая запись в БД)
  • была ли его информация (имя,адрес электронной почты и т. д.) является правильным
  • , было ли автоматически добавлено несколько полей в базу данных перед созданием
  • , было ли отправлено электронное письмо
  • , соответствует ли текст сообщения (т.е. подставьте имя пользователя и ссылку активации в шаблоне электронной почты)

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

Другие, кажется, призывают к функциональным тестам - отправлено ли электронное письмо (и, возможно, его текст - хотя, возможно, оно принадлежит тесту UserEmail?) И есть ли новая запись.

Вотвопрос о издевательстве / окурке.В функциональном тесте пользовательского контроллера я должен только удостовериться, что user.save вызван с соответствующими параметрами, или я должен проверить, что БД получает новую запись?Первый, кажется, вызывает заглушку и предполагает, что, поскольку Rails так хорошо протестирован, объект будет успешно сохранен, если .save вызывается в пользовательской модели.Но последний (например, вызов assert_difference) чувствует более тщательным.Какой выбрать?

Извините, если это слишком сложный вопрос - я понимаю, что это большая тема, но я надеюсь, что понимание конкретного (если длинный) примера, такого как это, прояснит многое о тестировании вгенерал.

Спасибо!

Ответы [ 2 ]

1 голос
/ 22 сентября 2010

Мне нравится выполнять свои функциональные тесты, чтобы ничего не издеваться / заглушки.По сути, вообще говоря, заглушки / насмешки очень полезны для модульного тестирования, поскольку они позволяют изолировать классы или единицы функциональности.Теперь, когда дело доходит до интеграционных и функциональных тестов, цель состоит в том, чтобы протестировать взаимодействия «реальных» классов, чтобы вы хотели избежать насмешек / заглушек.

Так что в вашем случае я бы задействовал БД при выполнении теста функционального уровня для пользовательского контроллера.Если вы решили заглушить уровень персистентности, я бы сказал, что вы тестируете модуль на контроллере (при условии, что других зависимостей нет) - такой тест не позволит вам обнаружить проблемы с уровнем персистентности (например, несовместимые изменения в вашей БДсхема, проблемы с подключением к БД и т. д.).

Суть в том, что оба метода верны, но подходящий способ сделать это зависит от цели (то есть функциональное, интеграционное или модульное тестирование).

1 голос
/ 31 июля 2010

Это не простой вопрос. В основном в мире Rails есть два лагеря . Один лагерь скажет вам использовать макет, поскольку это сделает ваши тесты быстрее. Другой лагерь скажет вам провести тестирование с базой данных, так как он будет более «точным», поскольку он проверяет, что таблица базы данных имеет правильные столбцы, что макет не будет делать. Оба лагеря скажут вам, что их стиль испытаний более понятен: -)

Мой совет: попробуйте один способ, затем попробуйте другой. Посмотрите, что работает для вас. Прежде всего, постарайтесь, чтобы ваши тесты были четкими и выразительными. Вы можете найти подсказки о том, как начать тестирование Rails в этой презентации Грегга Поллака .

...