25
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-12-15

開発環境

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

参考リンク

25
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?