Rails RSpec Тестирование: Undefined метод "доставить" для nil: NilClass

Я пытаюсь проверить, запускает ли метод e-mail в моем Rails 3.2 с помощью RSpec. Он работает в области производства и разработки, я просто не могу заставить его пройти мой тест.

Я получаю сообщение об ошибке undefined method 'deliver' for nil:NilClass

# user_spec.rb
it "should send an email if user has weekly email set to true" do
  @user = FactoryGirl.create(:user, user_name: "Jane Doe", email: "[email protected]", weekly_email: true, weekly_article_count: 10)
  Mailer.should_receive(:weekly_email)
  User.send_weekly_email
end

# user.rb
scope :weekly_email, where(:weekly_email => true)
scope :weekly_article_count, :conditions => ["weekly_article_count IS NOT NULL"]

def self.send_weekly_email
  @users = User.weekly_email.weekly_article_count
  @users.each do |user|
    Mailer.weekly_email(user).deliver
  end
end

Я также пробовал использовать Mailer.should_receive(:weekly_email).with(user), но потом получаю сообщение об ошибке undefined local variable or method 'user'

Ответ 1

Забавно, я просто должен был сделать это пару часов назад. Вам нужно также заглушить метод доставки, чтобы не допустить этого. В противном случае ваш should_receive возвращает nil, поэтому, когда ваш метод вызывает deliver, он вызывает nil.deliver.

Это должно работать:

Mailer.should_receive(:weekly_email).and_return( double("Mailer", :deliver => true) )

Ответ 2

Rspec имеет and_call_original, если вам не нужно менять исходное поведение. (doc) В вашем случае вы можете использовать Mailer.should_receive(:weekly_email).and_call_original.