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