tl; dr: Перейти к последнему абзацу
Недавно я пытался использовать спецификации запросов RSpec для более целенаправленного тестирования.
Этокак в основном выглядит мое тестирование:
- общая спецификация огуречных характеристик , т.е. пользователь переходит к сообщению с комментарием, голосует за комментарий, а автор получает баллы
- спецификации модели для случая, когда модель действительно имеет некоторую функциональность, т.е.
User#upvote(comment)
- спецификации контроллера , где я заглушаю большинство вещей и простопостарайтесь убедиться, что код работает так, как я ожидаю
- просмотр спецификаций для случаев, когда в представлении есть что-то сложное, например, рендеринг ссылки upvote только когдапользователь еще не высказал свое мнение, и это тоже ошарашено
Проблема в том, что у меня есть какой-то конкретный сценарий, который вызывает ошибку, и все, кажется, работает на уровне модель / представление, где я не могувоспроизвести это.
Это вынуждает меня написать интеграционный тест, который я также могу сделать в огурце.Проблема возникает, как только я могу воспроизвести ее, и мне нужно выяснить, почему это происходит.Обычно это означает играть в тестах, менять разные вещи и видеть, что происходит.
Например, создайте комментарий, принадлежащий пользователю, который пытается поднять голос, попытаться проголосовать с истекшим сеансом и т. Д. Однако это действительно огромная боль - писать в Cucumber из-за необходимости писатьсценарий, а затем укажите каждый шаг.
На данный момент, я предпочитаю писать спецификации запроса, потому что это более низкий уровень и позволяет мне напрямую делать вещи.Проблема в том, что я не совсем уверен, как правильно написать спецификацию запроса или каковы правила.
Простой пример здесь:
visit login_path
fill_in "Username", :with => user.username
fill_in "Password", :with => user.password
click_button "Log in"
против
post sessions_path(:username => user.username, :password => user.password)
или даже что-то более низкое, например
session[:user_id] = user.id # this actually doesn't work, but the idea is there
Оба этипримеры достигают того же самого, они регистрируют пользователя. Я знаю, что ответ, который нужно выбрать, основан на том, что мне нужно проверить, но это не дает правильного, обычного способа сделать это.
Я пытался найти кое-что о спецификациях запросов, но они нигде не описаны. Книга RSpec не охватывает их, документация RSpec тоже ничего не говорит.
Как правильно написать спецификации запроса?Когда я должен использовать капибару и когда только методы Rails #get
и #post
вместо нажатия кнопок и visit
путей ввода?