おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

Sidekiqを利用しているときにテストで気をつけること

Testing · sidekiq/sidekiq Wiki にあるように、sidekiqをテストで利用する際には3つのモードがあります。

  • fake(デフォルト)
  • inline
  • disable

これらを切り替えるメソッドとしてSidekiq::Testing.fake!などがあります。これらのメソッドはブロックを受け付けており、ブロックを渡すとそのブロックの中だけ一時的にモードが変わります。なので

before do 
  Sidekiq::Testing.inline!
end

after do
  Sidekiq::Testing.fake!
end

のようにするより

around do |example|
  Sidekiq::Testing.inline! do
    example.run
  end
end

のほうが良いと思ったんですが、これらの書き方は等価ではないので場合によっては前者の書き方じゃないとダメだったりします。

後者のブロックを用いた書き方ではモードが変わるのはカレントスレッドだけ、という制限があります。このため後者をsystem testで使うと、pumaのスレッドではモードが変更されないのでした。ドキュメントもよく読むと

When passing a block, the mode change only applies to the current Thread and is not process-wide.

のように書いてありますね。そうですね。