Тестирование after_create хуков с помощью rspec - PullRequest
5 голосов
/ 02 сентября 2011

У меня есть код в моей модели (RoR 3.0.x), который более или менее похож на это:

class Message

    after_create :notify

    protected

    def notify
        if visible?
            Notifier.message_from_portfolio( user, self ).deliver
        else
            Notifier.invisible_message_from_portfolio( user, self ).deliver
        end
    end

end

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

Моя спецификация:

describe :notification do
    it "should send the whole message by email when visible" do
        u = Factory.create( :user, :account_type => 1 )
        message = u.messages.build( :body => "Whatever", :author => "Nobody", :email => "test@example.com" )
        Notifier.should_receive( :message_from_portfolio )
        message.save
    end
end

Объект Notifier никогда не получает message_from_portfolio.Что я делаю неправильно?Предложения?

Ответы [ 2 ]

3 голосов
/ 03 сентября 2011

Factory.create уже сохранил сообщение, поэтому оно не создается, а сохраняется. Замените его на Factory.build и все должно быть в порядке.

0 голосов
/ 02 сентября 2011

Вы уверены, что обратный вызов достигнут? after_create не выполняется, если экземпляр недействителен.

Вы можете установить ожидание для целей отладки:

message.should_receive(:after_create)

Или, может быть, visible? возвращает false? Чтобы проверить это, вы можете использовать отрицательное ожидание:

Notifier.should_not_receive(:invisible_message_from_portfolio)
...