这是一个与导轨3.2.12中的水豚相关的集成测试案例。 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案有什么问题?谢谢你的帮助。
答案 0 :(得分:8)
看起来您的服务器正在锁定数据库,以便测试在运行后无法清理。
当你在没有JavaScript的情况下使用Capybara时,测试和服务器都在一个进程和线程中运行。这意味着他们可以共享相同的数据库连接和事务。这意味着RSpec可以使用简单的数据库事务来回滚测试结束时的更改,以及为什么在测试和服务器之间没有看到任何锁争用。
当你使用:js => true
运行时,事情会有所不同,服务器会在一个单独的线程或进程中启动测试,因此它们将分别使用单独的数据库连接和事务。这意味着RSpec默认使用的数据库事务策略将不起作用。它也会导致你的情况发生锁定错误。
Capybara readme讨论了这个问题,并建议database_cleaner gem作为这种情况的替代方案。您需要配置数据库清理程序以使用截断策略而不是事务