私の Rails アプリには、ActionMailer を介して電子メールを送信する after_action フックを持つコントローラーがいくつかあります。そのようです:
after_action :send_notifications, only: [:create, :update]
def send_notifications
case @record.status.downcase
when 'review', 'corrected'
RecordNotifier.received(@record).deliver_later
when 'rejected'
@rejection = Rejection.where(record_id: @record.id).last
RecordNotifier.rejected(@record, @rejection).deliver_later
when 'submitted'
@form = Form.find( @record.form_id )
RecordNotifier.submitted(@record).deliver_later
end
end
私の問題は、スペックの実行後にメーラーが実行を終了する必要がある場合があるため、テストスイートがランダムに失敗することですが、データベースは各テストの後にクリーンアップされるため、メーラーが必要とするオブジェクトはもう存在しません。しかし、それが問題だと確信しています。このように失敗したテストが 1 つありますがsleep 1
、最後のexpect(page).to have_something
ステートメントの前に追加したところ、合格しました。ログでも確認できました。アプリの準備が整う前に、データベースがザッピングされていました。
ちなみに、メーラー用の ActiveJob セットアップはありません。ガイドが同じように機能し、後で ActiveJob を追加すると、すでに準備が整っているとのことでしたので、deliver_later を使用しました。
では、どうすればこれを回避できますか? 仕様が終了して DatabaseCleaner が実行される前に、アプリがすべて完了していることを確認するにはどうすればよいですか?