Написание спецификации для наблюдателя, который запускает почтовую программу - PullRequest
3 голосов
/ 16 февраля 2011

Я пишу простой обозреватель комментариев, который запускает почтовую программу всякий раз, когда создается новый комментарий.Весь соответствующий код находится в этой сущности: https://gist.github.com/c3234352b3c4776ce132

Обратите внимание, что спецификации для Notification проходят, но спецификации для CommentObserver терпят неудачу, поскольку Notification.new_comment возвращает nil.Я обнаружил, что могу получить проходную спецификацию, используя вместо этого:

describe CommentObserver do
  it "sends a notification mail after a new comment is created" do
    Factory(:comment)
    ActionMailer::Base.deliveries.should_not be_empty
  end
end

Однако это не идеально, потому что он проверяет поведение почтовой программы в спецификации наблюдателя, когда все, что я действительно хочу знатьв том, что он правильно запускает почтовую программу.Почему почтовик возвращает nil в оригинальной версии спецификации?Каков наилучший подход для определения этого типа функциональности?Я использую Rails 3 и RSpec 2 (и Factory Girl, если это имеет значение).

1 Ответ

8 голосов
/ 17 февраля 2011

для контекста :

class CommentObserver < ActiveRecord::Observer
  def after_create(comment)
    Notification.new_comment(comment).deliver
  end
end

# spec
require 'spec_helper'

describe CommentObserver do
  it "sends a notification mail after a new comment is created" do
    @comment = Factory.build(:comment)
    Notification.should_receive(:new_comment).with(@comment)
    @comment.save
  end
end

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

describe CommentObserver do
  it "sends a notification mail after a new comment is created" do
    @comment = Factory.build(:comment)
    notification = mock(Notification)
    notification.should_receive(:deliver)
    Notification.stub(:new_comment).with(@comment).and_return(notification)
    @comment.save
  end
end

Почему почтовая программа возвращает ноль в исходной версии спецификации?

Я полагаю, это потому, что ожидания сообщений действуют как заглушки- если в .and_return() или в блоке не указано значение, should_receive возвращает nil.

...