Подтвердить что ты не робот

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?

4b9b3361

Ответ 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