В последнее время я разрабатываю небольшие веб-приложения на 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.

Спасибо за чтение!