Rails + ActiveJob + RSpec Tips

Railsでサービスを開発していると、バックグラウンドで処理を実行するジョブを実装することがあるかと思います。

そんなとき、いつもテストの書き方を忘れてしまうので、内容の理解と整理のために備忘録として記事を書こうと思います。

まずはそもそもどういったものをテストするべきかを整理してみたいともいます。

ジョブ自身は基本的に同期的に実行しているモデルまたはメール送信などの処理をバックグラウンドで非同期に実行することが多いと思います。

なので、ユニットテストでは基本的には正確に意図したジョブが呼び出されているか、ということさえ確認できればよいのではないかと思います。

もちろんこれはジョブ実行メソッドの中に余計な処理が書かれていないことが前提となります。

それでは簡単なサンプルと解説を書いていきたいと思います。

まずは config.active_job.queue_adapter を設定します。ここでは :test を指定していますが、ご自身の環境に合わせて設定してください。

それではテストコードを書いていきたいと思います。モデル、ジョブ、テストの順番にコードを書いていきます。

普段からRailsを利用している開発者からしたらどうということのないコードかと思います。

処理の流れとしては、 Thing の作成(または更新)処理が行われると、 commit をフックとして do_something_job の中で ThingJob が実行されます。

ThingJob では Thing#do_something が実行されます。

最初に書いたとおり、ここではコールバックの実行とともに想定通りのジョブがキューに追加されるかどうか、という部分を確認しています。

ActiveJob::TestHelper は実際にはなくても動くのですが、モジュールの中でジョブの初期化処理をやってくれているので、特に問題がなければインクルードしておくと良いかと思います。

勝手に初期化して欲しくないということであれば、上記のヘルパーを参考にして初期化処理をかくとよいかと思います。

と、ここまで書いておいてアレなのですが、実はRSpecのドキュメントにその他の細かいマッチャーなどもしっかり記載されています。

さらに詳細な条件でテストをしたい場合には、RSpecのドキュメントを参考にしてみてください。

すべてのケースをテストでカバーできるということはあり得ないのですが、それでも基本的なケースをいくつか抑えておくだけで変更の際の安心感が変わってきます。

苦手意識を持たず、満遍なくテストを書くことができるようにしていきましょう。

 

 


個人プロジェクトでプロジェクト管理ツールを運営しています。気になる方は30日間無料で利用できるので、ぜひお試しください!

プロジェクト管理のすべてを、一つの場所で - Seamless
https://seamless.jp/

スポンサードリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください