use*_*363 6 rspec capybara ruby-on-rails-3
这是一个与导轨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
Run Code Online (Sandbox Code Playgroud)
我们还尝试用这个案例包装describe "", :js => true do,如何有错误说
`An error occurred in an after hook ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked:`
Run Code Online (Sandbox Code Playgroud)
代码执行没有错误.rspec案有什么问题?感谢帮助.
看起来您的服务器正在锁定数据库,以便测试在运行后无法清理.
当你在没有JavaScript的情况下使用Capybara时,测试和服务器都在一个进程和线程中运行.这意味着他们可以共享相同的数据库连接和事务.这意味着RSpec可以使用简单的数据库事务来回滚测试结束时的更改,以及为什么在测试和服务器之间没有看到任何锁争用.
当你运行的:js => true东西有点不同时,服务器会在一个单独的线程或进程中启动到你的测试,这样每个人都会使用一个单独的数据库连接和事务.这意味着RSpec默认使用的数据库事务策略将不起作用.它也会导致您的情况发生锁定错误.
Capybara 自述文件讨论了这个问题,并建议在这种情况下使用database_cleaner gem作为替代方案.您需要配置数据库清理程序以使用截断策略而不是事务