I wanted to force an error condition in my cucumber tests, but the code ran through a DelayedJob, so I couldn’t redefine the code running under the .delay chain, because the DelayedJob worker will reload the normal code base for its processing. I finally realized that simply patching the delay instance method to return self for the class in question would bypass the delayed job.
def force_query_error
ObjectDelayed.class_eval do
alias :old_delay :delay
alias :old_query :query
def delay
self
end
def query
raise 'monkey'
end
end
end
def restore_query
ObjectDelayed.class_eval do
remove_method :query
remove_method :delay
alias :query :old_query
alias :delay :old_delay
end
end
This is not to be confused will actually allowing DelayedJob to do its thing:
When(/^I wait for processing of jobs$/) do
Delayed::Worker.new(:quiet => false).work_off
Timeout::timeout(10) do
until Delayed::Job.count == 0 do
end
end
end