2011-12-15 27 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 

這似乎對我有用。 乾杯!

相關問題