Тайм-аут базы данных при запуске RSpec/Capybara с драйвером javascript

Я пытаюсь получить некоторые примеры RSpec, работающие с Capybara, используя драйвер javascript (с Webkit или Poltergeist), но возникает проблема с блокировкой базы данных при обновлении таблицы. Вот часть рассматриваемого примера:

  scenario 'by changing the contract attributes', js: true do
    login_as @admin, scope: :user

    contract = Contract.create(number: '123',
                               start_at: Date.today,
                               end_at: Date.today + 1.month)

    visit "/contracts/#{contract.id}/edit"

Я использую Devise и Warden::Test::Helpersдля входа в систему.

Запуск RSpec занимает некоторое время, и все, что я получаю:

 Failure/Error: visit "/contracts/#{contract.id}/edit"
 Capybara::Driver::Webkit::WebkitInvalidResponseError:
   Unable to load URL: http://127.0.0.1:46520/contracts/1/edit

Журнал показывает, что есть проблема с блокировкой базы данных:

Started GET "/contracts/1/edit" for 127.0.0.1 at 2012-06-01 12:10:26 -0400
   (0.2ms)  BEGIN
   (51083.3ms)  UPDATE `users` SET `last_sign_in_at` = '2012-06-01 16:10:26', `current_sign_in_at` = '2012-06-01 16:10:26', `last_sign_in_ip` = '127.0.0.1', `current_sign_in_ip` = '127.0.0.1', `sign_in_count` = 1, `updated_at` = '2012-06-01 16:10:26' WHERE `users`.`id` = 1
Mysql2::Error: Lock wait timeout exceeded; try restarting transaction: UPDATE `users` SET `last_sign_in_at` = '2012-06-01 16:10:26', `current_sign_in_at` = '2012-06-01 16:10:26', `last_sign_in_ip` = '127.0.0.1', `current_sign_in_ip` = '127.0.0.1', `sign_in_count` = 1, `updated_at` = '2012-06-01 16:10:26' WHERE `users`.`id` = 1
   (0.8ms)  ROLLBACK

Я пробовал много вещей (этот вопрос казался наиболее близким к реальному решению: ] Capybara с :js => true приводит к сбою теста), но ничего не помогло, даже избавление от DatabaseCleaner. Есть ли что-нибудь еще, что я мог бы попробовать?

Изменить: Вот файл spec_helper.rbпо запросу: https://gist.github.com/2855631

5
задан Community 23 May 2017 в 11:53
поделиться