Ganesh
Ganesh

Reputation: 1

Testing sidekiq worker and retryset Rails minitest

I have a sidekiq middlware which catch custom exception

require 'celluloid'
require 'sidekiq/middleware/server/retry_jobs'

module Sidekiq
  class RetryMiddleware < Sidekiq::Middleware::Server::RetryJobs

    def call(worker, msg, queue)
      yield
    rescue Sidekiq::Shutdown
      # ignore, will be pushed back onto queue during hard_shutdown
      raise
    rescue Sidekiq::Retries::Retry => e
      # force a retry (for workers that have retries disabled)
      msg['retry'] = e.max_retries
      attempt_retry(worker, msg, queue, e.cause)
      raise e.cause
    rescue Sidekiq::Retries::Fail => e
      # seriously, don't retry this
      raise e.cause
    rescue Exception => e
      # ignore, will be pushed back onto queue during hard_shutdown
      raise Sidekiq::Shutdown if exception_caused_by_shutdown?(e)
      raise e unless msg['retry']
      attempt_retry(worker, msg, queue, e)
      raise e
    end

  end
end

and my worker looks like below

class SomeWorker
  include Sidekiq::Worker
  sidekiq_options retry: false

  def perform(input_data)
    begin
     logic to insert data into db
    rescue Ione::Io::ConnectionClosedError => e
     raise Sidekiq::Retries::Retry
    end
  end

end

When i was trying to test the SomeWorker peform method is adding the job to retry. In Testing I am not seeing the middleware is getting called

Thanks in advance

Upvotes: 1

Views: 1736

Answers (1)

Mike Perham
Mike Perham

Reputation: 22238

You're making this way too hard on yourself, just call the methods.

RetryMiddleware.new.call(MyWorker.new, { ... }, 'default') do
  MyWorker.new.perform(...)
end

Upvotes: 1

Related Questions