Capybara - Nie działa logowanie przy użyciu js drivera

To z mojej strony kolejne już z rzędu podejście do tematu testowania javascriptów i zaczynam być lekko sfrustrowany gdyż za każdym razem ponoszę kompletną klęskę. I to nie podczas pisania testów a podczas konfiguracji środowiska. Sprawa składa się z paru problemów więc opiszę je po kolei.

Selenium

Postanowiłem zacząć od domyślnego drivera żeby zbytnio nie komplikować sprawy. Napisałem sobie testy sprawdzające formularz logowania (bez js!) i wszystko działa bez zarzutu. Niestety, kiedy włączam sobie wsparcie js dla tych testów, zaczynam dostawać nieco absurdalne komunikaty. Oto moje testy:

require 'rails_helper'

feature "Signing In", js: true do
  background do
    @user = FactoryGirl.create(:user)
  end

  scenario "Signing in with correct credentials" do
    visit '/users/sign_in'
    within("#new_user") do
      fill_in 'Email', :with => @user.email
      fill_in 'Password', :with => 'TestPass'
    end
    click_button 'Log in'
    expect(page).to have_content 'successfully'
  end

end

Po uruchomienia wsparcja js, z jakiegoś niezrozumiałego dla mnie powodu, user stworzony w bloku background przestaje istnieć w bazie (sprawdzam to w widoku z formularzem logowania używając debug User.all, zwraca []) i rzecz jasna logowanie nie działa. Podkreślam, że dzieje się tak wyłącznie po aktywowaniu js.

Cała konfiguracja środowiska jest dosyć standardowa ale jeśli coś by mogło się tutaj okazać pomocne w diagnozie, to piszcie śmiało. Tak na pierwszy rzut jedyne co przychodzi mi do głowy to fakt, że używam database_cleaner i może on jakoś czyści tą bazę ale nie rozumiem czemu miało by się tak dziać jedynie w trybie js. (plik spec/support/database_cleaner.rb: https://gist.github.com/mbajur/037b754c9ab5f7cb57fa). Tak czy owak, to samo dzieje się po skasowaniu tego pliku z konfiguracją database_cleaner.

Webkit jako domyśly silnik js

Próbowałem skonfigurować webkita jako domyslny silnik do js na wszystkie sposoby znalezione na necie ale żaden nie chce działać, zawsze capybara używa selenium. Moje próby polegały na wstawieniu Capybara.default_driver = :selenium w różnych miejscach mojej aplikacji, tj. spec/support/env.rb, spec_helper.rb, rails_helper.rb, config/initializers/capybara.rb oraz już na chama w testach ale zawsze i tak odpala sie selenium.

Z góry dzięki za pomoc! :wink:

w testach JS powinieneś użyć strategii :truncation albo :deletion, te testy wykonują się w osobnym wątku/transakcji, dlatego przeglądarka nie widzi użytkownika zdefiniowanego w background.

1 Like

Tak! To było to, dzięki wielkie :wink: Kwestia podmiany drivera wciąż jednak pozostaje otwarta

By default, JavaScript tests are run using the :selenium driver. You can change this by setting Capybara.javascript_driver.