Как проверить, что связанный объект получает вызов метода в обратном вызове after_save? - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть простая модель с обратным вызовом 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

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

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 Ответ

0 голосов
/ 11 февраля 2020

expect(msg).to receive(:schedule_email) должен go ПЕРЕД фактическим тестовым вызовом, чтобы правильно установить ожидаемые сообщения. Так что это скорее будет:

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
...