RSpecのテスト中にMySQL client is not connected


開発環境

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

参考リンク