Rails/RSpec/Capybara — очистка базы данных без транзакций работает с Selenium, но не с Webkit

Итак, я настроил свою среду RSpec на использование стратегии очистки усечения для моих тестов RSpec Capybara, но я все еще обнаруживаю, что что-то все еще оборачивает мой тест в транзакцию, когда я использую Webkit в качестве драйвера Javascript.

У меня нет этой проблемы с Selenium, что поставило меня в тупик.

Вот соответствующая конфигурация RSpec с webkit:

Capybara.javascript_driver = :webkit

Capybara.register_driver :webkit do |app|
  Capybara::Webkit::Driver.new(app).tap do |driver|
    driver.allow_url "fonts.googleapis.com"
    driver.allow_url "dl.dropboxusercontent.com"
  end
end

config.before(:suite) do
  DatabaseCleaner.clean_with :truncation
  DatabaseCleaner.clean_with :transaction
end

config.after(:each) do
  ActionMailer::Base.deliveries.clear
end

config.around(:each, type: :feature, js: true) do |ex|
  DatabaseCleaner.strategy = :truncation
  DatabaseCleaner.start
  self.use_transactional_fixtures = false
  ex.run
  self.use_transactional_fixtures = true
  DatabaseCleaner.clean
end

И мой тест функций выглядит так:

feature "profile", js: true do
  describe "a confirmed user with a valid profile" do
    before(:each) do
      @user = FactoryGirl.create :user
      signin(@user.email, @user.password)
    end

    scenario 'can edit name' do
      visit edit_user_profile_path

      fill_in :user_name, with: 'New name'
      click_button :Submit
      @user.reload

      expect(@user.name).to eq('New name')
      expect(current_path).to eq show_user_path
    end
  end
end

Если я запускаю этот тест с помощью Webkit, он не проходит, но с Selenium он проходит.

Я экспериментировал с отладкой. Если я помещу оператор отладчика в действие #update, я увижу, что он корректно обновляет базу данных. Если в это время я подключаюсь к тестовой базе данных, я вижу новую информацию в базе данных, что означает, что это обновление не может быть заключено в транзакцию. Однако, но в отладчике в .spec @user по-прежнему видно исходное имя, сгенерированное Ffaker в factory_girl. Это наводит меня на мысль, что тест выполняется внутри транзакции.

Когда я меняю свой драйвер JavaScript на Selenium, все работает нормально.

Любые идеи?


person Sam Stickland    schedule 14.02.2015    source источник
comment
Ух ты. Я обнаружил проблему почти сразу после публикации вопроса.   -  person Sam Stickland    schedule 14.02.2015


Ответы (1)


Ух ты. Я обнаружил проблему почти сразу после публикации вопроса. Сделки не проводились.

Это была проблема гонки между бэкэндом и интерфейсом webkit/selenium. С помощью Webkit тест выполнял @user.reload и операторы ожидания до того, как контроллер получил возможность обновить базу данных. С Selenium все было наоборот.

Хитрость заключается в том, чтобы заставить Capybara ждать перезагрузки страницы. Я изменил свой тест на это:

scenario 'can edit name' do
  visit edit_user_profile_path

  fill_in :user_name, with: 'New name'
  click_button :Submit

  expect(current_path).to eq show_user_path
  @user.reload
  expect(@user.name).to eq('New name')
end
person Sam Stickland    schedule 14.02.2015