Как проверить, вызывает ли DelayedJob метод из другого класса? - PullRequest
0 голосов
/ 28 марта 2019

Я настраиваю спецификации для проверки, вызывает ли задание метод при определенных условиях.

Это то, что я имею до сих пор:

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

Я ожидал, что первый тест пройдёт, а второй не пройдёт. Однако мой первый тест не пройден, а второй проходит. Что я делаю не так?

1 Ответ

2 голосов
/ 29 марта 2019

Вы должны поставить ожидание перед 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
...