Тестирование rspec: добавление:js => true также влияет на блок before
У меня есть страница, предназначенная для бронирования встречи, и на ней есть некоторый код JavaScript, который выбирает самое раннее время и день, когда встреча будет доступна, после чего пользователь может нажать на кнопку, чтобы запланировать встречу.
Таким образом, чтобы проверить это, я написал несколько тестов rspec вроде следующего:
book_appointment_spec.rb
context "when on the profile page" do
before do
click_linkedin_button
end
it 'book an appointment', :js => true do
click_link "new-appointment"
choose "doctor1"
click_button "Submit and Schedule"
expect(page).to have_content "Congrats!"
end
end
click_linkedin_button - это определение метода, которое просто регистрирует пользователя через linkedin oauth. Проблема в том, что даже после настройки OmniAuth.config.mock_auth[:linkedin]
всякий раз, когда я устанавливаю:js => true вокруг этого блока, он просит меня войти через linkedin, http://imgur.com/mYUOxgD
Мне было интересно, если кто-нибудь знает, как решить эту проблему.
Ниже приведены другие файлы, которые могут иметь отношение к этой проблеме.
spec_helper.rb
require 'capybara/webkit/matchers'
Capybara.javascript_driver = :webkit
Gemfile
gem 'capybara-webkit'
gem 'database_cleaner'
gem 'capybara'
3 ответа
Как вы обнаружили, вы не можете выполнить часть теста, используя один драйвер, а часть теста - другой. Это было бы эквивалентно высказыванию
Given I login in using Safari.
Then I should be logged in using Firefox.
Таким образом, ваше решение заключается в том, что вы должны запустить свой js-код для входа в тестовую среду для входа. Это на самом деле хорошо (вы хотите проверить свой логин JS-код). Если вы хотите избежать фактического подключения к linkedin, каждый раз, когда вы запускаете этот тест, вам нужно смоделировать соединение с linkedin. Посмотрите на видеомагнитофон ( https://github.com/vcr/vcr), это позволит вам записать ваше подключение к linkedin, чтобы в последующих тестовых запусках вам не приходилось переходить к linkedin.
Настройка js: true
в вашем блоке rspec есть ярлык для использования драйвера с поддержкой javascript для всего примера. Таким образом, этот драйвер будет доступен и использоваться в течение всего выполнения или примера, который включает в себя все блоки до / после / вокруг.
Чтобы обойти это, вместо использования js: true
Вы можете вручную установить, какой драйвер использовать в точке (точках) вашего примера, где вам нужно.
it {
do_some_stuff_with_default_driver
Capybara.current_driver = :webkit
do_some_stuff_with_webkit
Capybara.current_driver = :selenium
do_some_stuff_with_selenium
}
РЕДАКТИРОВАТЬ
К сожалению, я только что прочитал это, так что, возможно, это решение не будет работать. пожалуйста, дай мне знать
Примечание: переключение драйвера создает новый сеанс, поэтому вы не сможете переключиться в середине теста.
Я решил эту проблему, создав реальную учетную запись linkedin, поместив эту информацию об аутентификации в.env и просто вызвав метод fill_in, чтобы заполнить поле адреса электронной почты и пароля во время обратного вызова. И застрял с запуском драйвера JS во всем блоке контекста.
РЕДАКТИРОВАТЬ: Это, конечно, не лучший ответ, поэтому я все еще принимаю другие ответы.