トップ «前の日記(2011/02/27 (日) ) 最新 次の日記(2011/03/01 (火) )» 編集 RSS feed

HsbtDiary


2011/02/28 (月) [長年日記]

[rails][ruby] delayed_job なタスクを rspec でテスト

最近、非同期処理を実現するときは redis + resque がとてもかわいいんだけど、rails とべったりな処理をするときは相変わらず delayed_job を使っている。delayed_job に限らないけど、非同期な処理をするメソッドのテストは割と大変…かと思っていたら手段はあるみたい。

非同期処理の中が動いていることを確認

config/initializer/delayed_job_config.rb とかに以下の処理を追加。

Delayed::Worker.delay_jobs = !Rails.env.test?

これで Rails.env.test? な時には delay を書いていても通常の処理を同じになるので、いつも通り期待する動きを rspec で書けば良い。

非同期処理となることを確認

上の処理を追加した上で、まず before で以下の処理を実行する

Delayed::Job.all.each &:destroy
Delayed::Worker.delay_jobs = true

これで delayed_job に入っているキューが空っぽになった上で、非同期処理が一時的に動くようになる。その後に delay な処理となるであろう条件を揃えて delay 処理を実行。実行後に

Delayed::Job.all.should_not be_empty

とかで delayed_job にキューが入っていることを確認。これに加えて、delay な処理がすぐに実行されないことも確認出来るといいかもね。例えば ActionMailer::Base.deliveries が空であることとか。

そして最後に after で

Delayed::Worker.delay_jobs = false

を実行して非同期処理を test で無効としておしまい。

これでだいぶテストできるね。

本日のツッコミ(全1件) [ツッコミを入れる]
# dot (2011/03/01 (火) 17:08)

こんな記事を待っていましたw