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
エラー内容
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
で処理を止めながらテスト内容を確認してみたところ、なぜかすべてのテストが成功した。
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
に以下の記述をすることでも対処出来た。
Rails.application.configure do
config.active_job.queue_adapter = :inline
# 省略
end
参考リンク
Author And Source
この問題について(RSpecのテスト中にMySQL client is not connected), 我々は、より多くの情報をここで見つけました https://qiita.com/shun915a/items/e18f538be6221f929876著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .