今回は、workerのテストを書いていきます。
前提環境
Redis Worker Classの場合
方針を決めます。retryの上限数を超えた場合のテストも書きたいので、(Dead Job Queueに移す前に通る
# app/workers/high_worker.rb
class HighWorker
include Sidekiq::Worker
sidekiq_options queue: 'high'
sidekiq_retries_exhausted do |msg, ex|
puts "hoge" # loggerへの記載 or 通知
end
def perform(args)
raise
end
end
max_retriesは、sidekiq.ymlでも定義することができ、各worker classでも定義できます。
# sidekiq.yml max_retries: 1
でリトライの上限数を変更できます。
Rspec
Dead Job Queueに移動する際のテストを書く ただし、コールバックが呼ばれるかのテストではなく、そこに書いているロジックをテストしたい。これもクラスとしてくくり出せるならそちらでテストを書くことでも回避できる。
上記テストのためにgem rspec-siedkiqを追加する。
(sidekiqにもテスト用moduleがありますが、上記のテストを行いたいので、こちらを選びました)
# Gemfile group :test do gem 'rspec-sidekiq' end
# app/workers/high_worker_spec.rb
require 'rails_helper'
Rspec.describe HighWorker do
describe '#perform' do
it 'should be enqueue' do
expect do
HighWorker.perform
end.to change(HighWorker.jobs, :size).by(1)
end
it 'shold call sidekiq_retries_exhausted' do
HighWorker.within_sidekiq_retries_exhausted_block do
expect(HighWorker).to receive(:puts).with('hoge')
end
end
end
end
おまけ
警告文を削除したい場合
> [rspec-sidekiq] WARNING! Sidekiq will *NOT* process jobs in this environment. See https://github.com/philostler/rspec-sidekiq/wiki/FAQ-&-Troubleshooting # rails_helper.rbに追記 RSpec::Sidekiq.configure do |config| # Warn when jobs are not enqueued to Redis but to a job array config.warn_when_jobs_not_processed_by_sidekiq = false end
以上になります。
参考
Error Handling · mperham/sidekiq Wiki · GitHub