This page looks best with JavaScript enabled

【Rails】ActiveStorageでたまに落ちるテストの解消

 ·   ·  ☕ 2 分で読めます
✏️

環境

  • Rails 6.1.3.2
  • RSpec 3.10

エラー

ActiveRecord::InvalidForeignKey

1
2
3
4
Failure/Error: let(:user) { create(:user) }

ActiveRecord::InvalidForeignKey:
  Mysql2::Error: Cannot add or update a child row: a foreign key constraint fails (`circle_test`.`active_storage_attachments`, CONSTRAINT `fk_rails_c3b3935057` FOREIGN KEY (`blob_id`) REFERENCES `active_storage_blobs` (`id`))

外部キーの整合性が取れていない。
CicrleCIでのテスト時に下記エラーが発生して落ちることがあった。落ちないこともあったし、ほとんどのローカルでは再現できなかった。

ActiveRecord::ConnectionNotEstablished

1
2
3
4
Failure/Error: _query(sql, @query_options.merge(options))

ActiveRecord::ConnectionNotEstablished:
  MySQL client is not connected

DBとのコネクションが切れている。
ローカルではこのエラーは発生していた。

解消法

1
2
3
Rails.application.configure do
  config.active_job.queue_adapter = :inline
end

の記述を追加する。

Active Storage の概要 - Railsガイド

ActiveJobが使っていないけど……と思っていたけど、ActiveStorageの内部で非同期実行が行われていた。
なので、テスト環境では同期実行を行うようにする。

rspecでDBコネクションエラーが発生するようになった話 - Qiita

また、ActiveJob::TestHelperをincludeして、perform_enqueued_jobsで処理を囲むことで特定の処理だけ同期実行することができる。

1
2
3
perform_enqueued_jobs do
  # ブロック内の処理が同期実行される
end

ActiveJob::TestHelper
RSpec でキューイングした ActiveJob を同期実行する - Qiita

おわりに

このエラーは@kazu20200705さんがローカルで再現できたので検証してくれて解消できました。
ありがとうございました。

Share on

END
END
@aiandrox

目次