Rspe c, Capybara и Poltergiest: не удалось добраться до сервера, только когда js: true включено - PullRequest
1 голос
/ 26 февраля 2020

У меня есть рабочие интеграционные / функциональные тесты с использованием Rails 4, rspe c -rails 3.6 и capybara 2.18. Я пытаюсь заставить эти тесты проходить на страницах, которые переписываются в javascript framework (React). Для этого мне нужно использовать драйвер, такой как Poltergeist, вместо браузера без заголовка по умолчанию, чтобы javascript мог работать на тестовых страницах.

Я установил poltergeist 1.18. Я добавляю Capybara.javascript_driver = :poltergeist, нет проблем. Тесты проходят со старыми (html -только) страницами.

Однако просто , добавляя js: true к существующему работающему тесту (то есть до изменения отображаемой страницы на новая версия), и тест завершается неудачно с

Request to 'http://account.example.com/user/sessions/new' failed to reach server, check DNS and/or server status

Обратите внимание, что этот URL использует субдомен account в нашем приложении, и это может быть связано с проблемой.

Вот один из неудачных тестов, изолированный.

feature 'Vistor tries to login', js: true do
  scenario 'with valid login', :with_project_access_user do
    visit new_user_sessions_url
    fill_in 'user_session[login]', with: 'test@gmail.com'
    fill_in 'user_session[password]', with: 'mysweetpassword'
    click_button 'Log In'
    expect(current_url).to match('http://account\.')
  end
end

В первой строке он не проходит: visit new_user_sessions_url. Этот тест проходит, если я удаляю js" true. В обоих случаях new_user_sessions_url - это "http://account.example.com/user/sessions/new"

Использование new_user_sessions_path вместо new_user_sessions_url здесь не работает, поскольку поддомен является обязательной частью маршрута. Если существует способ сопоставления поддоменов (без удаления поддоменов - они используются в нашем производственном приложении), это вполне приемлемое решение.

Поскольку тест работает без js: true, я должен предположить, что Capybara делает что-то негласное для обработки домена example.com. Но как добавление js: true сломает это? И как я могу это исправить, чтобы мои существующие тесты прошли?

1 Ответ

1 голос
/ 27 февраля 2020

Когда не используется js: true Capybara использует драйвер rack_test, который полностью игнорирует имена хостов, поэтому важен только путь. Когда вы используете js: true, используются настоящие имена хостов, потому что «браузер» запрашивает их, чтобы выяснить, где делать свои запросы. Вы несете ответственность за то, чтобы имя хоста, с которым ваше приложение генерировало URL-адреса, разрешалось по ip, который приложение прослушивает. Самое простое решение для этого - добавить записи в / etc / hosts, отображающие имена доменов / поддоменов, которые вы используете для тестирования, на 127.0.0.1.

Примечание: Poltergeist использует Phantom JS, что эквивалентно 8 -9-летний браузер на данный момент. Это означает, что вы, скорее всего, столкнетесь с проблемами, пытаясь запустить на нем приложения React, и вам действительно стоит заняться обновлением до драйвера для современного браузера - Selenium, Apparition и т. Д. c.

.
...