最近、非同期処理を実現するときは 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 で無効としておしまい。
これでだいぶテストできるね。
こんな記事を待っていましたw