Как проверить спасательный блок в моей модели обратного вызова в RSpec? - PullRequest
0 голосов
/ 08 февраля 2019

В моей модели есть метод after_save для вызова некоторой фоновой задачи.Поскольку эта задача зависит от работоспособности другого сервера, я подумал, что было бы неплохо создать запасной вариант для выполнения задачи в главном потоке при сбое вызова на другой сервер.

Это в основном обратный вызов:

  def send_email
    MyJob.perform_async(self.id)
  rescue Errno::ECONNREFUSED
    MyJob.new.perform(self.id)
  end

Теперь я бы хотел проверить это поведение.Я попытался высмеять MyJob и вызвать исключение для метода perfrom_async.Но как мне проверить, что в экземпляре вызывается выполнение?

Я уже пробовал:

it "should use fallback to send e-mail after create when faktory is down" do
  job = class_double("MyJob").
  as_stubbed_const(:transfer_nested_constants => true)

  allow(job).to receive(:perform_async) { raise Errno::ECONNREFUSED }
  expect_any_instance_of(job).to receive(:perform)
  company_opt_out
end

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Старайтесь не перегружать блок it слишком сильно, когда вы пишете тест, поскольку его становится трудно читать, когда вы или другой разработчик возвращаетесь к нему позже.

  let(:job_instance) { instance_double(MyJob, perform: "Performing now") }

  before do
    allow(MyJob).to receive(:perform_async).and_return("Performing later")
    allow(MyJob).to receive(:new).and_return(job_instance)
  end

  it "performs the job later" do
    expect(send_email).to eq("Performing later")
  end

  context "when a network error is raised" do
    before { allow(MyJob).to receive(:perform_async).and_raise(Errno::ECONNREFUSED) }

    it "performs the job now" do
      expect(send_email).to eq("Performing now")
    end
  end

0 голосов
/ 08 февраля 2019

нет необходимости заглушать класс MyJob

it "should use fallback to send e-mail after create when faktory is down" do
  allow(MyJob).to receive(:perform_async).and_raise(Errno::ECONNREFUSED)
  expect_any_instance_of(MyJob).to receive(:perform)
  company_opt_out
end

, но убедитесь, что ваши company_opt_out вызовы send_email метод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...