Capybara和chrome驱动程序:SQLite3 :: BusyException:数据库被锁定

时间:2015-04-01 09:22:42

标签: ruby-on-rails rspec sqlite

偶尔我会在运行我的功能规格时使用chromedriver进行一些视觉测试等。为此,我只需在特定规格上设置driver: :chrome

我似乎很长时间没有这样做,因为自从我今天尝试以来,我收到了以下错误:

SQLite3::BusyException: database is locked

使用默认的JavaScript驱动程序(poltergeist)运行规范时不会发生这种情况。

在Google上搜索会导致solution which shows how to monkey patch active record。不过,这对我来说很奇怪。为什么之前有效?这是一些线程问题吗?我不喜欢猴子修补,也许有更好的解决方案。

1 个答案:

答案 0 :(得分:0)

根据cucumber-rails中的this功能:

  

使用@javascript标记运行方案时,Capybara会触发   在一个单独的线程中同一个进程中的Web服务器   cukes。默认情况下,这意味着ActiveRecord会单独给它   数据库连接,这又意味着你输入的数据   来自Cucumber步骤定义的数据库(例如使用FactoryGirl)不会   在数据库事务发生之前,Web服务器可见   提交。

     

因此,如果您使用事务策略来清理数据库   在场景结束时,它不适用于javascript场景   默认值。

     

有两种解决方法。一种是切换到截断   javascript场景策略。这比较慢,但更可靠。

     

另一种方法是修补ActiveRecord以共享单个数据库   线程之间的连接。这意味着你仍然可以获得速度   使用事务回滚数据库的好处,但是你   当他们说话时,冒着两个线程相互踩踏的风险   到数据库。

     

现在,默认行为是使用截断,但你可以   通过告诉cucumber-rails使用哪种策略来覆盖它   javascript场景。

     

对于截断的情况,删除策略可以更快   导致一些Oracle用户报告的锁。

从最后一段开始,您可以通过更改env.rb中的以下行来使用删除策略:

Cucumber::Rails::Database.javascript_strategy = :truncation

由:

Cucumber::Rails::Database.javascript_strategy = :deletion