Проверить наличие обратных вызовов ActiveRecord

Как вы можете проверить наличие обратного вызова в вашей модели, в частности, вызванного созданием записи, такой как after_create или же after_commit on: :create?

Вот пример обратного вызова с (пустым) методом, который он вызывает.

# app/models/inbound_email.rb

class InboundEmail < ActiveRecord::Base
  after_commit :notify_if_spam, on: :create

  def notify_if_spam; end
end

Вот ожидающая спецификация, использующая RSpec 3.

# spec/models/inbound_email_spec.rb

describe InboundEmail do
  describe "#notify_if_spam" do
    it "is called after new record is created"
  end
end

Использование ожидания сообщения для проверки того, что метод вызывается, похоже на путь. Например:

expect(FactoryGirl.create(:inbound_email)).to receive(:notify_if_spam)

Но это не работает. Другой способ - проверить, что при создании записи происходит что-то внутри вызываемого метода (например, электронное письмо отправлено, сообщение зарегистрировано). Это означает, что метод был вызван и, следовательно, обратный вызов присутствует. Однако я нахожу это неаккуратным решением, так как вы действительно тестируете что-то еще (например, электронное письмо отправлено, сообщение зарегистрировано), поэтому я не ищу подобные решения.

1 ответ

Решение

Я думаю, что Фридрих Чунг прав. Это должно работать. Проблема с вашим примером в том, что обратный вызов уже был вызван до того, как ожидание было установлено.

describe InboundEmail do
  describe "#notify_if_spam" do
    it "is called after new record is created" do
      ie = FactoryGirl.build(:inbound_email)
      expect(ie).to receive(:notify_if_spam)
      ie.save!
    end
  end
end
Другие вопросы по тегам