Capybara с: js => true вызывает тест
Я новичок в Capybara и тестирую Rails в целом, поэтому, пожалуйста, простите меня, если это простой ответ.
У меня этот тест
it "should be able to edit an assignment" do
visit dashboard_path
select(@project.client + " - " + @project.name, :from => "assignment_project_id")
select(@team_member.first_name + " " + @team_member.last_name, :from => "assignment_person_id")
click_button "Create assignment"
page.should have_content(@team_member.first_name)
end
он проходит как есть, но если я добавляю: js = > true, он терпит неудачу с
cannot select option, no option with text 'Test client - Test project' in select box 'assignment_project_id'
Я использую FactoryGirl для создания данных, и по мере прохождения теста без JS я знаю, что эта часть работает.
Я пробовал использовать драйвер JS по умолчанию и с помощью драйвера: webkit (с установленным capybara-webkit)
Думаю, я недостаточно понимаю, что делает JS для Capybara.
Почему тест с ошибкой с JS?
Ответы
Ответ 1
Я прочитал readme Capybara в https://github.com/jnicklas/capybara, и он решил мою проблему.
Транзакционные светильники работают только в драйвере Rack:: Test по умолчанию, но не для других драйверов, таких как Selenium. Огурец позаботится об этом автоматически, но с помощью Test:: Unit или RSpec, возможно, вам придется использовать database_cleaner gem. См. это объяснение (и код для решение 2и решение 3).
Но в основном это проблема с потоками, в которой Capybara имеет свой собственный поток при запуске драйвера без стойки, что делает функцию транзакционных привязок использовать второе соединение в другом контексте. Таким образом, нить драйвера никогда не находится в том же контексте запуска rspec.
К счастью, это может быть легко решено (по крайней мере, для меня) для динамического переключения в стратегии DatabaseCleaner:
RSpec.configure do |config|
config.use_transactional_fixtures = false
config.before :each do
if Capybara.current_driver == :rack_test
DatabaseCleaner.strategy = :transaction
else
DatabaseCleaner.strategy = :truncation
end
DatabaseCleaner.start
end
config.after do
DatabaseCleaner.clean
end
end
Ответ 2
Вариант brutuscat answer, который фиксировал наши спецификации функций (которые все используют Capybara):
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
# set the default
DatabaseCleaner.strategy = :transaction
end
config.before(:each, type: :feature) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.append_after(:each) do
DatabaseCleaner.clean
end
Ответ 3
Существует еще один способ справиться с этой проблемой, описанной здесь и обсуждаемой здесь: Почему бы не использовать общие подключения ActiveRecord для Rspec + Selenium?