В последнее время я разрабатываю небольшие веб-приложения на Ruby, используя Sinatra в качестве серверной части, тестируя с помощью RSpec и Capybara. Это прошло хорошо, однако я заметил, что есть определенные сценарии, в которых полезные страницы ошибок 404 и 500 Sinatra могут привести к ложным срабатываниям в ваших тестах.
(невероятно надуманный) пример
Допустим, нам нужно простое веб-приложение, в которое вы можете ввести фразу, и оно вернет ее вам. Тест функций Capybara для этого выглядит так:
Итак, чтобы пройти этот тест, добавьте маршрут к контроллеру для get '/'
, который возвращает следующий файл erb:
При запуске RSpec тест зеленый, так что давайте собираться и восхищаться нашей работой.
Пока все выглядит хорошо, поэтому давайте заполним поле «Эхо» и нажмем Shout.
Черт! Эта надоедливая страница Sinatra 404 содержит слово «Hello», и этого достаточно для Capybara, так что тест пройден! Это наше ложное срабатывание.
Итак, мы возвращаемся к контроллеру и добавляем маршрут для post '/echo'
. Здесь мы можем написать некоторый код, чтобы очень просто вернуть переданный параметр. Возможно, подойдет следующее:
Запуск RSpec снова показывает нам, что тест проходит, и, надеюсь, теперь это не просто ложное срабатывание (скрестим пальцы).
На этот раз после ввода «Привет» и нажатия кнопки «Крикнуть» нас приветствует:
Страница ошибки Sinatra! Еще одно ложное срабатывание! Синатра очень услужливо сообщает нам, что мы используем неопределенную переменную param. Мы, конечно, имеем в виду параметры, как это предполагает.
Причина ложного срабатывания заключается в том, что Sinatra очень любезно предоставляет детали запроса POST, в этом случае переменная «echo» имела значение «Hello», а поскольку «Hello» присутствует на странице, этого достаточно для Capybara. так что тест проходит.
Как избежать ложных срабатываний
1. Ожидайте не увидеть «Синатру»:
Включение чего-то вроде expect(page).to_not have_content 'Sinatra'
в ваши тесты приведет к сбою теста, если он встретит страницу Sinatra 404 или 500.
Это не сработает, если вы делаете сайт о Фрэнке Синатре…
2. Конкретизируйте свои ожидания:
Ожидание, что определенный элемент будет содержать ожидаемое содержимое, также будет работать:
within('#result') { expect(page).to have_content 'Hello' }
Вы также можете сделать что-то вроде этого:
expect(page.first('#result')).to have_content 'Hello'
Существует несколько способов указания элементов с помощью Capybara, поэтому поэкспериментируйте и посмотрите, что лучше всего подходит для вас.
3. Отключите исключения Sinatra:
Добавление set :show_exceptions, false
к вашему классу контроллера заставит Sinatra отказаться от причудливой подробной страницы с ошибкой 500 и просто вернуть:
Я бы посоветовал использовать это в крайнем случае, потому что 500 ошибок, которые предоставляет Sinatra, действительно полезны для отладки.
Если вы хотите сами увидеть код, загляните в репозиторий git.
Спасибо за чтение!