Почему я получаю следующую ошибку?«Mysql2 :: Ошибка: закрытое соединение MySQL: ПОКАЗАТЬ ТАБЛИЦЫ» - PullRequest
0 голосов
/ 16 декабря 2011

Использование Spork, Rails3, RSpec2, Capybara и FactoryGirl.

При попытке выполнить тест Capybara я получаю следующую ошибку:

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

База данных MySQL, которую использует database.yml, запущена и работает. Я могу подключиться к нему из командной строки, используя те же настройки в 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:

Также важно упомянуть, что я использовал решение 3 для проблемы Capybara Transactional Fixtures , связанной с не 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

Я слышал, что были подобные проблемы при использовании решения 3 с spork в комментарии к решение 2 . Я не уверен, что это те проблемы, о которых говорил комментатор.

1 Ответ

3 голосов
/ 17 декабря 2011

Я думаю, что понял это.Мне не удалось найти решение в Интернете, поэтому я приведу здесь документ на тот случай, если кто-нибудь еще найдет это сообщение об ошибке.

Мне кажется, проблема в том, что Spork кэшировал / хранил закрытый MySQL.подключение.

Это потому, что реализация Solution 3 выше находится в определении Spork.prefork .Так что он будет запущен только один раз при запуске Spork.Уничтожение и перезапуск Spork временно решит проблему.Однако проблема вернется, если другое соединение MySQL будет закрыто в новом процессе Spork.

Постоянное исправление состоит в перемещении Solution 3 в вашем файле spec_helper.rb в 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

Кажется, это сработало для меня.Ура!

...