【问题标题】:How to test if a DelayedJob is calling a method from another class?如何测试 DelayedJob 是否正在调用另一个类的方法?
【发布时间】:2019-08-19 14:44:18
【问题描述】:

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

这是我目前所拥有的:

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

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

【问题讨论】:

  • 查看第一个测试用例的完整错误消息会很有帮助

标签: ruby rspec ruby-on-rails-5 tdd


【解决方案1】:

您必须将期望放在之前 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 2014-02-11
    • 1970-01-01
    相关资源
    最近更新 更多