Тестирование прогрессивно улучшенных функций с Capybara

Я использую Capybara для тестирования функций на прогрессивно улучшенном веб-сайте. Допустим, моя особенность заключается в том, чтобы перемещаться по иерархии мест. Версия без javascript включает в себя получение новой версии страницы, когда мы кликаем по разным местам. Усовершенствованная версия JavaScript открывает скрытые элементы или загружает новую информацию через Ajax.

Я начну с написания теста для не JavaScript-версии, которая выглядит примерно так:

When I visit the page for "UK"
And I click "London"
Then I should see the information for "London"

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

Затем я создаю идентичный тест для версии javascript, помеченный @javascript. Он запускает тест с драйвером javascript, и этот тест проходит, потому что функция была реализована. (Он проходит через поток не-JS). Тем не менее, я хочу, чтобы версия теста на javascript провалилась на этом этапе, потому что функция еще не была расширена с помощью Javascript.

Поэтому я ищу хорошую стратегию для определения того, пришла ли с сервера новая страница или нет, и чтобы обе версии функции работали. (Я планирую интегрировать это с pushState, так что тестирование на измененный URL не пройдет)

2 ответа

Решение

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

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

  • Версия страницы с расширенным сценарием может добавить некоторый элемент в DOM, указывая, что расширения активны, или указывая, что данные получены из запроса AJAX, а не загрузки страницы.
  • Вы можете генерировать случайный идентификатор страницы (с сервера) при каждой загрузке (например, новый GUID), встраивать его в DOM и утверждать, что он не изменился после взаимодействия (в расширенной версии). Это был бы очень простой способ достижения поставленной цели ("определение того, пришла ли целая новая страница с сервера")

Почему ваша "улучшенная" версия javascript работает так же, как и не расширенная версия? Ваши тесты на огурец, использующие @javascript, должны тестироваться, чтобы убедиться, что улучшения работают.

Например, * если JavaScript открывает модальное диалоговое окно вместо ссылки на новую страницу, проверьте это. * если javascript отправляет форму и обновляет значение, проверьте это.

Эти тесты не пройдут, если они будут выполняться без поддержки JavaScript.

Другие вопросы по тегам