Должен ли я действительно тестировать контроллеры?

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

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

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

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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

  • Контрольные тесты не выполняются в среде, в которой они запущены, т.е. они не находятся в конце стека промежуточного программного обеспечения стойки, поэтому такие вещи, как пользователи, недоступны при использовании devise (как один простой пример). Поскольку Rails больше ориентируется на установку в стойке, используются дополнительные средние стойки, и ваша среда все больше отклоняется от поведения "unit".
  • Вы не тестируете поведение своего приложения, вы проверяете его реализацию. Смеясь и пробивая себе путь, вы повторно реализуете реализацию в форме спецификации. Один простой способ сказать, делаете ли вы это; если вы не измените ожидаемое поведение отклика url, но измените реализацию контроллера (возможно, даже карту на другой контроллер), ваши тесты прерываются? Если это так, вы тестируете реализацию не поведением. Вы также настраиваете себя на совесть. Когда вы заглушаете и насмехаетесь, нет никаких заверений в том, что выработанные вами макеты или заглушки делают то, что вы думаете о них, или даже если методы, которые они притворяются существующими после рефакторинга, происходят.
  • Вызов методов контроллера невозможно через общедоступные приложения api. Единственный способ добраться до контроллера - через стек и маршрут. Если вы не можете сломать его из запроса через URL-адрес, действительно ли он нарушен?

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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