使用实例double测试ActiveJob重试

时间:2019-06-07 18:51:57

标签: ruby-on-rails ruby rspec rails-activejob

我正在尝试使用实例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实例对它进行测试。

2 个答案:

答案 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 gistRspec's Job Spec documentation都有帮助。