2011-12-15 2 views
0

Spork, Rails3, RSpec2, Capybara 및 FactoryGirl 사용. 나는 다음과 같은 오류를 얻을 카피 바라 테스트를 실행하는 중에다음과 같은 오류가 발생하는 이유는 무엇입니까? "Mysql2 :: 오류 : MySQL 연결이 닫혔습니다 : 테이블 표시"

: database.yml을 사용한다

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

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 : 관련된 Capybara Transactional Fixtures Issue에 그것은 내가 solution 3를 사용하고 언급하는 것도 중요

non 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 명령을 실행 해 보셨습니까? –

+0

그래, 나는 동일한 사용자/암호/데이터베이스와 MySQL에 로그인 할 수 있으며 표시 테이블을 실행합니다. 예상대로 작동합니다. – plainjimbo

+0

MySQL2 github : https : // github에서 제기 된 문제가 있습니다. – plainjimbo

답변

3

나는 이것을 알아 냈다고 생각합니다. 나는 웹상에서 해결책을 찾을 수 없었기 때문에, 다른 사람들이 그 오류 메시지를 찾기 위해 여기에서 문서화 할 것이다.

나는 Spork가 닫힌 MySQL 연결을 캐싱/유지하고 있었다고 생각합니다. 솔루션 위의 3의 구현이 Spork.prefork 정의에 앉아 있기 때문에

이다. 따라서 Spork가 출시 될 때만 실행됩니다. Spork 살해 및 재시작은 일시적으로 문제를 해결합니다. 그러나 새로운 Spork 프로세스에서 다른 MySQL 연결이 닫히면 문제가 다시 발생합니다.

영구 수정 같은 파일에 Spork.each_run 정의에 솔루션 귀하의 spec_helper.rb 파일에 3을 이동하는 것입니다. 따라서 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 

이것은 나를 위해 일한 것 같습니다. 건배!

+3

나는이 부분을 움직이는 것으로 발견했다 :'ActiveRecord :: Base.shared_connection = ActiveRecord :: Base.connection'을'each_run' 블록으로 옮기면 나머지는 머무를 수있다. 'prefork' 블록) –

관련 문제