2017-06-20 75 views
1

所以即时运行SQLite并试图使用灯具加载正确的数据显示和测试通过与水豚浏览器。SQLite3:繁忙的例外与水豚/ Poltergeist

我的测试套件为驱动程序使用Minitest w/Capybara和Poltergeist。我test_helper.rb文件的相关部分看起来像这样:

require "minitest/reporters" 
reporters = [] 
reporters << Minitest::Reporters::SpecReporter.new 
Minitest::Reporters.use! reporters, ENV, Minitest.backtrace_filter 

require "minitest/rails/capybara" 
Capybara.register_driver :poltergeist do |app| 
    Capybara::Poltergeist::Driver.new(app, :js_errors => false) 
end 
Capybara.default_driver = :poltergeist 
Capybara.current_driver = :poltergeist 
Capybara.javascript_driver = :poltergeist 

但是我有一个简单的测试,存根用户访问级别登录因为这是上运行的Web应用程序,然后简单地参观路线。

然而,它似乎是我使用的“用户访问存根”方法失败。看起来像Core::User.any_instance.stubs(etc...)这只是返回一个用户模型。

不管怎么说确切的错误我得到的是:

ActiveRecord::StatementInvalid:   ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked: commit transaction 

由于IM使用夹具将这个也许是一个DB清洁问题(我不是现在使用它作为我只是在使用预先创建灯具目前)我”我从来没有使用DB清洁剂与微型,因为我只熟悉与rspec和工厂女孩使用它。

回答

1

错误告诉你,另一个数据库连接已经有sqlite可以写入(它可以处理多个读取器,但一次只能有一个写入器)。你不会显示你的实际测试或你的存根,所以你不可能特别说明你的问题在哪里,但是你有提出请求的可能性,然后在发生的时候运行一些其他数据库访问(例如,你是否预先加载了对象存根会返回,还是在存根被执行时被加载?)。

如果您的应用程序不使用sqlite作为数据库,那么切换到测试数据库应用程序将在生产中使用。另外,在功能测试中,存根是一种反模式,您应该创建适当的记录并处理它们。

+0

我希望我可以发布代码,但因为它是工作代码......我不能。事情是,虽然测试只是打开一个页面并加载用户,而另一个测试成功。然而,另一个测试只是使用minitest和用户代理,'红宝石'page.driver与水豚。而我正在用水豚使用poltergeist。 – msmith1114

+0

@ msmith1114我不明白'cap.dara与pagebdriver'是什么意思,如果你的意思是它使用racktest驱动程序,那么这是一个巨大的差异,因为它全部在同一个线程中运行 - 因此只有一个数据库连接。当使用poltergeist时,至少有2个线程(测试,应用程序)并且可能更多,当页面加载和多个数据库连接时可以有多个请求。如果你的应用程序实际上并没有在生产交换中使用sqlite来测试你在生产中使用的任何东西,那么你将有一个更容易的时间。 –

+0

问题是我们的产品数据库是一个非常古老的SQL-Server版本,因此数据库清洁工程师将无法使用,因此每次都要回到一个干净的版本基本上是不可能的。有没有办法解决这个sqlite问题?或者我现在只需要坚持使用基于非浏览器的测试。和它说它使用的驱动程序(别人写这记得)被设置为:'page.driver.header('User-Agent','Ruby')'这即时猜测意味着它使用机架驱动程序 – msmith1114