【问题标题】:Database timeout when running RSpec/Capybara with javascript driver使用 javascript 驱动程序运行 RSpec/Capybara 时数据库超时
【发布时间】:2012-06-06 22:44:44
【问题描述】:

我正在尝试使用 javascript 驱动程序(使用 Webkit 或 Poltergeist)获取一些与 Capybara 一起使用的 RSpec 示例,但是在更新表时数据库存在锁定问题。以下是相关示例的一部分:

  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 with :js => true causes test to fail)但没有任何效果,甚至摆脱了 DatabaseCleaner。还有什么我可以尝试的吗?

编辑:这是所要求的spec_helper.rb 文件:https://gist.github.com/2855631

【问题讨论】:

  • 你能发布你的 spec_helper 文件吗?
  • @DVG 我已经编辑了我的问题,并带有指向要点的链接。

标签: javascript ruby-on-rails database rspec capybara


【解决方案1】:

对我来说,解决方案正好相反:)

我已将其设置为false:

config.use_transactional_fixtures = false

这一切都奏效了。使用 true 时,它不像以前那样工作了。

【讨论】:

    【解决方案2】:

    几乎可以肯定

    config.use_transactional_fixtures = true
    

    为了获得干净的数据,它试图在事务中运行您的示例。由于您使用的是 Database Cleaner,因此您已经拥有此功能,因此请将其设置为 false,您应该一切顺利。

    https://www.relishapp.com/rspec/rspec-rails/docs/transactions

    【讨论】:

    • 非常感谢,这太明显了,我自己永远也找不到! ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多