2011-12-15 60 views
0

使用Spork,Rails3,RSpec2,Capybara和FactoryGirl。为什么我会收到以下错误? “Mysql2 :: Error:关闭MySQL连接:SHOW TABLES”

虽然试图执行一个水豚测试中,我得到以下错误:

Failure/Error: model = FactoryGirl.create(:model) 
    ActiveRecord::StatementInvalid: 
     Mysql2::Error: closed MySQL connection: SHOW TABLES 

是database.yml中使用MySQL数据库,启动并运行。我可以使用database.yml中的相同设置从命令行连接到它。

测试工作正常,我试图找出为什么测试失败,然后开始给这个错误。

我试着关闭并重新启动数据库无济于事。

从database.yml的

test: 
    adapter: mysql2 
    encoding: utf8 
    reconnect: false 
    database: mysql_app_test 
    pool: 5 
    username: root 
    password: 
    host: localhost 

从我的规格

require 'spec_helper' 

describe "Model", :js => true do 

    before(:each) do 
    model = FactoryGirl.create(:model) 
    visit model_path(model) 
    end 

    it "should show the button" do 
    # Start the lesson 
    find("#startButton") 
    end 
end 

UPDATE:

同样重要的一提的是我一直在使用solution 3Capybara Transactional Fixtures Issue相关使用非Rack :: Test驱动程序。

我已经把我的解决方案在我spec_helper.rb文件像这样:

Spork.prefork do 
    ... 
    class ActiveRecord::Base 
    mattr_accessor :shared_connection 
    @@shared_connection = nil 

    def self.connection 
     @@shared_connection || retrieve_connection 
    end 
    end 

    ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection 
    ... 
end 

我听说有在solution 2评论类似issues when using solution 3 with spork。我不确定这些是评论者提到的问题。

+0

您是否尝试过从命令行运行SHOW TABLES命令? – 2011-12-15 20:19:15

+0

是的,我可以使用相同的用户/密码/数据库登录到Mysql并运行SHOW TABLES。按预期工作。 – plainjimbo 2011-12-15 22:36:20

回答

3

我想我已经想通了。我无法在网络上找到解决方案,因此我会在此处记录以防其他人在搜索该错误消息。

我认为这个问题是Spork缓存/保持一个封闭的MySQL连接。

这是因为执行解决方案3以上是坐在Spork.prefork的定义。所以它只会在Spork推出时运行一次。杀死并重新启动Spork将暂时解决问题。但是,如果在新的Spork过程中关闭另一个MySQL连接,问题将会恢复。

永久的解决办法是在你的spec_helper.rb文件3移动溶液进入Spork.each_run定义在同一个文件。所以你的spec_helper.rb文件应该是这样的:

Spork.prefork do 
    ... 
    ... 
end 

Spork.each_run do 
    ... 
    class ActiveRecord::Base 
    mattr_accessor :shared_connection 
    @@shared_connection = nil 

    def self.connection 
     @@shared_connection || retrieve_connection 
    end 
    end 

    ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection 
    ... 
end 

这似乎对我有用。 干杯!

相关问题