このような非同期のものをテストすることは常に注意が必要です。私たちがしていることは:
機能テストでは、ジョブがキューに入れられることを確認します。通常は、モカなどを期待して使用するだけで十分です。テストRedisサーバーを実行する場合は、正しいキューが拡張され、ジョブパラメーターが正しいことを確認できます。その時点でResque自体を少しテストしていますが。
ジョブは、単体テストとして個別にテストされます。と呼ばれるクラスメソッドがあるだけなので、perform
単体テストは非常に簡単です。あなたの場合、ChangeRecorderJob.performがあなたが望むことをすることをテストするでしょう。私たちは、ジョブが適切なキューにあること、ジョブのパラメーターが有効であること、およびジョブが必要なことを実行することをテストする傾向があります。
さて、すべてを一緒にテストするのは難しい部分です。私はこれを2つの異なる方法で行いましたが、それぞれに長所と短所があります。
ジョブを同期的に実行するためのMonkey-patchResqueue.enqueueresque 1.14.0以降 、monkey-patchingの代わりに初期化子で使用できます。Resque.inline = true
- キューからジョブをポップし、実際にフォークされたプロセスで実行するワーカーをシミュレートします
ジョブを同期的に実行することは、2つのうちではるかに簡単です。spec_helperに次のようなものをロードするだけです。
モジュールResque
alias_method:enqueue_async、:enqueue
def self.enqueue(klass、* args)
klass.new(0、* args).perform
終わり
終わり
Resque.inline = true
resque 1.14.0以降では、モンキーパッチの代わりにイニシャライザーで設定できます。古いバージョンのresqueで立ち往生している場合は、モンキーパッチが必要です。
ここでは同期して実行しているため、長時間実行するジョブのコストが発生することに注意してください。おそらくもっと重要なのは、同じプロセスで実行されるため、ジョブの実行方法を完全に正確に表したものではないということです。
resqueのように、フォークされたワーカーでジョブを実行するには、次のようなことを行う必要があります。
def run_resque_job(job_class、job_args、opts = {})
queue = opts [:queue] || 「test_queue」
Resque :: Job.create(queue、job_class、* job_args)
ワーカー=Resque:: Worker.new(queue)
worker.very_verbose = opts [:verbose]の場合はtrue
opts [:fork]の場合
#単一のジョブを実行してからシャットダウン
defworker.done_working
素晴らしい
シャットダウン
終わり
worker.work(0.01)
そうしないと
job = worker.reserve
worker.perform(job)
終わり
終わり
ワーカーがジョブをキューからポップするのにわずかな遅延があります。そして当然、ワーカーがポップオフするキューを持つように、テストredisサーバーを実行する必要があります。
他の人がresqueジョブをテストする賢い方法を思いついたと確信しています。これらは私のために働いているものです。