Techioz Blog

Ruby Rspec、ワーカーが再帰的に呼び出された回数を調べる

概要

Rspec でワーカーをテストして、同じワーカーが再帰的に何度も呼び出された回数を調べる必要があります。 例えば:

Class Myworker
  def perform(id)
    model = Mymodel.find(id)
    associated_records = Mymodel.users.limit(1000)
    associated_records.each(&:destroy)
    if Mymodel.users.exists?
      Myworker.perform_async(id)
    end
  end
end

この反復が何回起こったかを数えるために、これの rspec を書く必要があります。

ワーカーをスタブ化してカウンターを増分しようとしましたが、ワーカーをスタブ化しているため、同じワーカーが再度実行されず、最終値としてカウンター 1 が表示されます。 RSPEC でワーカーが再帰的に呼び出された回数を確認する方法。

解決策

おっしゃるとおり、大量のデータベース レコードを削除すると、ジョブにさらに時間がかかり、最終的には他のバックグラウンド ジョブが遅延します。

しかし、通常は複数のワーカーを同時に実行することになるため、これは実際には問題となるはずです。また、複数の巨大なジョブがより重要なジョブを遅らせるという問題が依然として発生する場合は、優先順位の異なる複数のキューを設けることを検討する必要があります。

Sidekiq で複数の優先キューを設定している場合は、次のように、ジョブを変更して優先度の低いキューで実行し、クリティカル キューやデフォルト キューをブロックしないようにすることができます。

class DestroyUsersAssociatedToMyModel
  include Sidekiq::Job
  sidekiq_options queue: 'low'

  def perform(id)
    MyModel.find(id).users.destroy_all
  end
end