内容は薄いですが結構ハマったのでメモ
結論
非同期処理内でDBからデータ取ってくるときはassert_enqueued_jobs
とかassert_enqueued_emails
で囲んどこう
経緯
弊社のプロダクトではRuby on Railsを利用していてMinitestでテストを書いているんですが、最近になって頻繁にテストが失敗するようになりました。 成功する時もあれば失敗する時もあり、docker-composeでコンテナ立ち上げすぎて色々足りてないのかなーぐらいに思ってたのですが、大体止まったタイミイングのログを見るとActionMailer周りの処理だったので、非同期処理が何か悪さしてるのかと思って調査をはじめました。
予想
最近入れたactive_elastic_jobが悪いんじゃないか
最近非同期処理に影響を与えそうな改修をしたのはこれだったので一番怪しんでたのですが冤罪でした
そもそもtestのqueue_adapterにactive_elastic_job使ってなかったので関係ない
testのRollback先に走ってjobのdeserialize失敗してるんじゃないか
基本的にはログ出さずに止まってるだけだったのですが、たまにdeserializeでエラーログ出ることがあったので怪しいと思い調査 queueを処理してからテスト終わるようにしたらうまくいくんじゃないかと思ったので↓みたいにassert_enqueued_emailsで囲んでみたところ
class SampleTest < ActiveSupport::TestCase include ActionMailer::TestHelper test 'sample test' do assert_enqueued_emails 1 do Sample.test_method end end end
ActiomMailer起因で失敗することがなくなりました
絶対失敗するわけじゃなかったり最近失敗が増えてきたのはコンテナの立てすぎでテストの処理が重くなってJobの処理する前にRollbackしちゃうケースが増えちゃったって感じなんですかね