如何测试 DelayedJob 是否正在调用另一个 class 的方法?

How to test if a DelayedJob is calling a method from another class?

我正在设置规范以测试作业是否在特定条件下调用方法。

这是我目前拥有的:

describe RandomJob do
  context "when payload[:type] = MyModel" do
    let!(:my_model) { create :my_model }
    let!(:payload)  { { type: "MyModel", id: my_model.id } }

    context "when Model exists" do
      it "calls MyModel.fire! with payload" do
        RandomJob.perform_now(payload)
        expect_any_instance_of(MyModel).to receive(:fire!).with(payload)
      end
    end

    context "when Model does not exist" do
      it "does not call MyModel.fire!" do
        RandomJob.perform_now(payload)
        expect_any_instance_of(MyModel).not_to receive(:fire!)
      end
    end
  end
end

只是为了确保我的测试方式有效。我这样设置我的工作:

class RandomJob < ApplicationJob
  def perform(payload)
    @payload = payload

    fire_model!
  end

  private

  def fire_model!
    my_model&.fire! @payload
  end

  def my_model
    MyModel.find(@payload[:id])
  end
end

我预计第一个测试会通过,而第二个测试会失败。但是,我的第一个测试失败了,而第二个测试通过了。 我做错了什么?

您必须将期望值 放在 调用 perform_now 之前。

    context "when Model exists" do
      it "calls MyModel.fire! with payload" do
        expect_any_instance_of(MyModel).to receive(:fire!).with(payload)
        RandomJob.perform_now(payload)
      end
    end

    context "when Model does not exist" do
      it "does not call MyModel.fire!" do
        expect_any_instance_of(MyModel).not_to receive(:fire!)
        RandomJob.perform_now(payload)
      end
    end