kikeda1104's blog

備忘録・技術に関することを書いています。(webエンジニア)

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

GitHub - philostler/rspec-sidekiq: RSpec for Sidekiq

Testing · mperham/sidekiq Wiki · GitHub