मैं एक ऐसा नमूना लिखने की कोशिश कर रहा हूं जो पुनर्विक्रय-पुनः प्रयास की पुनः प्रयास कार्यक्षमता का परीक्षण करता है और मुझे बाध्यकारी.pry के सही तरीके से हिट करने के लिए परीक्षण नहीं मिल रहे हैं। क्या rspec 3 का उपयोग करके इस कार्यक्षमता का परीक्षण करने का कोई तरीका है, इसलिए मैं सत्यापित कर सकता हूं कि वे इरादे से काम कर रहे हैं?रीस्क-रीट्री और रेल 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
क्या आपके पास एक उदाहरण spec है? –
बचाव पुनः प्रयास का उपयोग न करें, अपवाद पकड़ें और कोड – user1735921