Как проверить, что связанный объект получает вызов метода в обратном вызове after_save?

У меня есть простая модель с after_save вызовом after_save для обновления некоторых вещей в связанной модели при изменении статуса:

class Model < ApplicationRecord
  has_many :related_records
  after_update :check_change
  enum :status { 'status1', 'status2'}

  def check_change
    return unless saved_change_to_status?

    related_records.each(&:schedule_email)
  end

Теперь я хотел бы проверить этот метод с Rspec. Сначала я проверил, вызывается ли метод, что успешно:

it "should be called"
  expect(subject).to receive(:check_change)
  subject.save
end

Теперь я хотел бы проверить, получает ли каждая из связанных записей метод schedule_email :

  it 'should call method on related records' do
    subject.update(status: 'status2')
    subject.emails.each do |msg|
      expect(msg).to receive(:schedule_email)
    end
  end

Как-то это не работает. Я также попытался вызвать update после ожидания без какой-либо удачи. Я не могу понять, что происходит не так. Есть идеи?

Изменить: Я также создал точку останова после оговорки в методе. Во время теста он останавливает выполнение, поэтому я предполагаю, что метод schedule_email вызывается для всех связанных записей ... Должен ли я expect по-другому?

Всего 1 ответ


expect(msg).to receive(:schedule_email) должны идти ДО фактического тестового вызова, чтобы правильно установить ожидания сообщения. Так что было бы лучше:

it 'should call method on related records' do
  subject.emails.each do |msg|
    expect(msg).to receive(:schedule_email)
  end
  subject.update(status: 'status2')
end

Есть идеи?

10000