Капибара с: js => true вызывает сбой теста - PullRequest
50 голосов
/ 18 ноября 2011

Я новичок в 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?

Ответы [ 3 ]

107 голосов
/ 02 января 2012

Я прочитал файл readme для Capybara по адресу https://github.com/jnicklas/capybara, и он решил мою проблему.

Транзакционные приспособления работают только в стандартном драйвере Rack :: Test, но не для других драйверов.как селен.Cucumber позаботится об этом автоматически, но с Test :: Unit или RSpec вам, возможно, придется использовать gem для database_cleaner.См. это объяснение (и код для решение 2 и решение 3 ) для получения подробностей.

Но в основном это проблема многопоточности, котораяподразумевает, что Capybara имеет свой собственный поток при запуске не-Rack-драйвера, что делает функцию фиксации транзакций использовать второе соединение в другом контексте.Таким образом, поток драйвера никогда не находится в том же контексте запущенного 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
9 голосов
/ 22 января 2015

Вариант ответа brutuscat , который исправил наши характеристики (которые все используют 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
7 голосов
/ 01 февраля 2013

Существует еще один способ решения этой проблемы, который описан и обсужден здесь: Почему бы не использовать общие подключения ActiveRecord для Rspec + Selenium?

...