Должен ли я действительно тестировать контроллеры? - PullRequest
11 голосов
/ 25 мая 2011

Я пытаюсь получить наилучший результат для кода / времени разработки

В настоящее время я использую rspec + shoulda для тестирования своих моделей и rspec + capybara для написания приемочных испытаний.

Я пытался написать тест контроллера для простого crud, но это заняло слишком много времени, и в конце я получил запутанный тест (вероятно, мой плохой)

Какая самая лучшая практика при тестировании контроллера с помощью rspec?

Вот суть моего теста и моего контроллера (один тест еще не пройден):

https://gist.github.com/991687 https://gist.github.com/991685

Ответы [ 7 ]

15 голосов
/ 26 мая 2011

По моему мнению, приемочные тесты (то есть огурец / капибара) проверяют взаимодействия, которые пользователь обычно выполняет с приложением. Обычно это включает в себя такие вещи, как, например, может ли пользователь создать определенный ресурс с действительными данными, а затем он увидит ошибки, если введет неверные данные. Тест контроллера больше подходит для вещей, которые пользователь не должен нормально выполнять, или для крайних крайних случаев, которые слишком (у) громоздки для тестирования с Cucumber.

Обычно, когда люди пишут тесты контроллера, они эффективно тестируют то же самое . Единственная причина для проверки метода контроллера в тесте контроллера - для крайних случаев.

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

Убедиться, что ваше действие new успешно отвечает и не содержит синтаксической ошибки? Пожалуйста. Это то, что вам скажут ваши огурцы. Если действие внезапно разворачивается в случае * * * * * , ваша функция сломается, и вы это исправите.

Еще один способ думать об этом: хотите ли вы протестировать определенное действие, реагирующее определенным образом (например, тесты контроллера), или вас больше волнует, что пользователь может перейти к этому действию new и действительно выполнить все ходы создания этого ресурса (например, приемочные испытания)?

13 голосов
/ 26 мая 2011

Возможно, нет.

Конечно, вы можете написать тесты для вашего контроллера. Это может помочь написать лучшие контроллеры. Но если логика в ваших контроллерах проста, как и должно быть, тогда тесты вашего контроллера не там, где сражение выиграно.

Лично я предпочитаю хорошо протестированные модели и полный набор интеграционных (приемочных) тестов, а не контроллеров в любое время.

Тем не менее, если у вас проблемы при написании тестов для контроллеров, , то всеми средствами проверяйте их . По крайней мере, пока вы не освоитесь с этим. Затем решите, хотите ли вы продолжить или нет. То же самое касается любого вида теста: пробуй, пока не поймешь, решай потом.

6 голосов
/ 06 сентября 2011

Написание тестов контроллера дает вашему приложению разрешение лгать вам.Некоторые причины:

  • тесты контроллера не выполняются в среде, в которой они выполняются. Т.е. они не находятся в конце стека промежуточного программного обеспечения стойки, поэтому такие вещи, как пользователи, недоступны при использовании devise (какодин простой пример).По мере того, как Rails все больше перемещается к установке на основе стоек, используется все больше промежуточного программного обеспечения для стоек, и ваша среда все больше отклоняется от поведения «юнитов».
  • Вы не тестируете поведение своего приложения, вы тестируетереализация.Пересматривая и заглядывая, вы повторно реализуете реализацию в форме спецификации.Один простой способ узнать, делаете ли вы это;если вы не измените ожидаемое поведение URL-ответа, но измените реализацию контроллера (возможно, даже сопоставите его с другим контроллером), ваши тесты не пройдут?Если это так, вы тестируете реализацию, а не поведение.Вы также настраиваете себя, чтобы лгать.Когда вы заглушки и макеты, нет никаких гарантий, что макеты или заглушки, которые вы настроили, будут делать то, о чем вы думаете, или даже если методы, которые они притворяются, существуют после рефакторинга.
  • Вызов методов контроллераневозможно через ваши приложения 'public' API. только *1009* способ добраться до контроллера через стек и маршрут.Если вы не можете оторвать его от запроса через URL-адрес, действительно ли он сломан?

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

Еще один пример, когда вы тестируете ваше «поведение» вашего приложения, заботитесь ли вы о том, что какой-то конкретный шаблон файла был обработан или что возникло определенное исключение, или вместо этого поведение вашего приложения возвращает некоторыевещи для клиента с определенным кодом состояния?

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

2 голосов
/ 26 мая 2011

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

2 голосов
/ 25 мая 2011

Определенно проверьте контроллер. Несколько болезненно выученных эмпирических правил:

  • макет объектов модели
  • Методы объекта-заглушки модели, которые использует действие вашего контроллера
  • жертвуйте большим количеством кур.
2 голосов
/ 25 мая 2011

Стоит ли тестировать?да

Существуют гемы, которые ускоряют тестирование контроллеров

http://blog.carbonfive.com/2010/12/10/speedy-test-iterations-for-rails-3-with-spork-and-guard/

1 голос
/ 26 мая 2011

Многие люди, похоже, переходят к подходу использования Cucumber для интеграционного тестирования вместо написания контроллера и маршрутизации.

...