偶尔我会在运行我的功能规格时使用chromedriver进行一些视觉测试等。为此,我只需在特定规格上设置driver: :chrome
。
我似乎很长时间没有这样做,因为自从我今天尝试以来,我收到了以下错误:
SQLite3::BusyException: database is locked
使用默认的JavaScript驱动程序(poltergeist)运行规范时不会发生这种情况。
在Google上搜索会导致solution which shows how to monkey patch active record。不过,这对我来说很奇怪。为什么之前有效?这是一些线程问题吗?我不喜欢猴子修补,也许有更好的解决方案。
答案 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