6

这是一个在 rails 3.2.12 中使用 capybara 的集成测试用例。click_link 'New Log'是一个ajax调用。然而,打开的页面以 $() 开头,并且有一堆 js 转义,如 \n 和 \log-log。

it "should work with link on show customer_comm_record page" do
      visit customer_customer_comm_records_path(@cust)
      #visit customer_customer_comm_record_path(@cust, @crecord)
      click_link @crecord.id.to_s     
      click_link 'New Log'
      save_and_open_page
end

我们也尝试用 包裹箱子describe "", :js => true do,怎么会有错误说

`An error occurred in an after hook   ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked:`

代码执行没有错误。rspec 案例有什么问题?感谢帮助。

4

1 回答 1

8

看起来您的服务器正在锁定数据库,因此测试在运行后无法清理。

当您在没有 JavaScript 的情况下使用 Capybara 时,测试和服务器都在单个进程和线程中运行。这意味着它们可以共享相同的数据库连接和事务。这意味着 RSpec 可以使用简单的数据库事务在测试结束时回滚更改,以及为什么您在测试和服务器之间看不到任何锁争用。

当你运行的:js => true东西有点不同时,服务器在一个单独的线程或进程中启动你的测试,因此它们每个都将使用单独的数据库连接和事务。这意味着 RSpec 默认使用的用于清理的数据库事务策略将不起作用。在您的情况下,它也会导致锁定错误。

Capybara自述文件讨论了这个问题,并推荐database_cleaner gem 作为这种情况下的替代方案。您将需要配置数据库清理器以使用截断策略而不是事务

于 2013-03-10T11:04:33.983 回答