我正在尝试使用实例double来测试ActiveJob worker的重试配置,但是失败了。
我在工作中有这个
class MyWorker < ApplicationJob
retry_on MyError, wait: 30.minutes, attempts: 3
def perform
raise MyError
end
end
测试如下:
context "retry job" do
let(:instance) { instance_double(MyWorker) }
it "retries after 30 minutes" do
allow(MyWorker).to receive(:new).and_return(instance)
allow(instance).to receive(:perform_now)
expect(instance).to receive(:retry_job)
.with({ priority: nil, queue: nil, wait: 30.minutes.to_i })
MyWorker.perform_now
end
end
该测试的终止条件为:
Failure/Error:
expect(instance).to receive(:retry_job)
.with({ priority: nil, queue: nil, wait: 30.minutes.to_i })
(InstanceDouble(MyWorker) (anonymous)).retry_job({:priority=>nil, :queue=>nil, :wait=>1800})
expected: 1 time with arguments: ({:priority=>nil, :queue=>nil, :wait=>1800})
received: 0 times
如果我使用allow_any_instance_of
测试重试,则测试通过,但我想了解如何使用double实例对它进行测试。
答案 0 :(得分:0)
julia> x = 1; y = 2;
julia> println(x < y ? "less than" : "not less than")
less than
julia> x = 1; y = 0;
julia> println(x < y ? "less than" : "not less than")
not less than
答案 1 :(得分:0)
我不建议以这种方式进行测试,因为它不是在测试所描述的类。 doubles的用例是模拟接触您正在测试的描述类的其他对象的预期行为,而不是描述类本身。 let(:instance) { instance_double(MyWorker) }
应替换为作业类的真实实例,如下所示:
subject(:job) { described_class.new }
您可能会发现this gist和Rspec's Job Spec documentation都有帮助。