開発環境
macOS Catalina 10.15.7
Ruby on Rails 6.0.0
RSpec 4.0.1
pry rails 0.3.9
FactoryBot 6.1.0
エラー内容
console
Failure/Error: _query(sql, @query_options.merge(options))
ActiveRecord::StatementInvalid:
Mysql2::Error: MySQL client is not connected
どうやらMySQLクライアントとの接続が確立できていないようだ。
定義を見る限り、client が初期化されているにも関わらず、network socket (file descriptor) が無効な状態だとこのエラーになるみたいですね。
Mysql2 の "MySQL client is not connected" について
検証
テストの実行結果を見ると、途中まではテストが成功しているため、ひとまずbinding.pry
で処理を止めながらテスト内容を確認してみたところ、なぜかすべてのテストが成功した。
console
Finished in 16.16 seconds (files took 2.21 seconds to load)
15 examples, 0 failures
仮説
FactoryBotのインスタンス生成の記述を増やしたタイミングでエラーがエラーが発生しはじめたため、ここで負荷がかかって処理が止まった可能性があると考えた。
対処法1
インスタンスを生成するタイミングでsleep
で処理を待機させることにした。
RSpec.describe OrderItem, type: :model do
describe '購入情報の保存' do
before do
@user = FactoryBot.create(:user)
@item = FactoryBot.create(:item)
@order_item = FactoryBot.build(:order_item)
sleep 0.1 # 0.1秒待機
end
# 省略
結果
エラーを吐かずにテストが安定して成功するようになった。
対処法2
config/environments/test.rb
に以下の記述をすることでも対処出来た。
config/environments/test.rb
Rails.application.configure do
config.active_job.queue_adapter = :inline
# 省略
end
参考リンク
- Mysql2 の "MySQL client is not connected" について
- Rubyでsleepを使う方法【初心者向け】
- [Mysql2::Error: # MySQL client is not connected — Rails 6.0.2.2 with rspec; Ruby 2.6.4 mac os Catalina + Mojave
] (https://stackoverflow.com/questions/60919107/mysql2error-mysql-client-is-not-connected-rails-6-0-2-2-with-rspec-ruby)