resque-retry의 재시도 기능을 테스트하는 스펙을 작성하려고하는데 binding.pry를 정확하게 테스트 할 수없는 것 같습니다. rspec 3을 사용하여이 기능을 테스트 할 수있는 방법이 있습니까? 그렇다면이 기능이 의도 한대로 작동하는지 확인할 수 있습니까?resque-retry 및 Rails 4에서 재시도 및 실패를 테스트하는 방법은 무엇입니까?
이것은 요청 사양이며 설비를 통해 실시간 요청을 시뮬레이션하려고 시도하지만 어떤 작업을 시도하든 다시 시도 할 수없는 것으로 보입니다.
gem 'resque', require: 'resque/server'
gem 'resque-web', require: 'resque_web'
gem 'resque-scheduler'
gem 'resque-retry'
gem 'resque-lock-timeout'
나는 resque_rspec를 사용하여,이 testing strategy을 시도하고있다.
일부 사양
it 'retries it' do
stub_request(:any, /.*api.bigcartel.*/).to_return(body: '{}', status: 200)
@order_shipped_json['order']['originator_id'] = @provider_order
post "/hook/shops/#{@shop.id}", @order_shipped_json.to_json, format: :json
ResqueSpec.perform_all(queue_name)
???
end
큐 작업
class QueueHook
extend Resque::Plugins::LockTimeout
extend Resque::Plugins::Retry
extend QueueLock
extend QueueLogger
@queue = AppSettings.queues[:hook_queue_name].to_sym
@lock_timeout = 600
@retry_exceptions = [QueueError::LockFailed]
@retry_limit = 600
@retry_delay = 1
class << self
def perform(web_hook_payload_id, _whiplash_customer_id)
ActiveRecord::Base.clear_active_connections!
@web_hook_payload = WebHookPayload.find(web_hook_payload_id)
klass_constructor
@hook.process_event
end
def identifier(_web_hook_payload_id, whiplash_customer_id)
"lock:integration_hook:#{whiplash_customer_id}"
end
def after_perform_delete_webhook(_web_hook_payload_id, _whiplash_customer_id)
@web_hook_payload.destroy
end
private
...
end
end
큐 작업 모듈
module QueueLogger
def before_perform_log_job(*args)
Rails.logger.info "[Resque][#{self}] running with #{args.inspect}..."
end
def on_failure_log_job(*args)
message = "[Resque][#{self}] failed with #{args.inspect}..."
run_counters
Rails.logger.info message_builder(message)
end
private
def run_counters
@num_attempts += retry_attempt
@all_attempts += retry_limit
end
def message_builder(message)
return message unless @num_attempts
return message += " Retrying (attempt ##{@num_attempts + 1})" if @num_attempts < @all_attempts
message += ' Giving up.'
message
end
end
module QueueLock
def loner_enqueue_failed(*args)
Rails.logger.info "[Resque][#{self}] is already enqueued: #{args.inspect}..."
end
def lock_failed(*)
raise QueueError::LockFailed
end
end
예외 처리기를 사용해야합니다. – user1735921
예제 사양이 있습니까? –
구조 재 시도, 예외 잡기 및 코드 다시 시도 사용 안 함 – user1735921