如何测试 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
我正在设置规范以测试作业是否在特定条件下调用方法。
这是我目前拥有的:
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