sidekiq + redisの構築(Rails 4系) 3
今回は、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