Вызов метода ActionMailer, возвращающий nil в модуль во время тестирования rspec - PullRequest
9 голосов
/ 27 марта 2012

У меня есть ActionMailer класс

class UserMailer < ActionMailer::Base 
  default from: "no-reply@spicy-millennium.com" 

  def submission_reminder user 
    @user = user           
    mail :to => user.email, :subject => "Your timesheet needs to be submitted!" 
  end    
end

Если я вызываю UserMailer.submission_reminder(current_user) в процессе разработки, он возвращает мне Mail::Message объект, как и ожидалось.

Место в моем приложении, где вызывается этот метод, находится в модуле, который у меня есть в папке lib:

module TimesheetSubmissionNotifier                            
  def self.send_submission_reminders
    User.all.each { |user| UserMailer.submission_reminder(user).deliver }
  end
end

Когда я вызываю TimesheetSubmissionNotifier.send_submission_reminders в разработке, UserMailer.submission_remind (user) возвращает почтовое сообщение и вызывается доставка, все работает как надо.

Проблема в том, что когда я вызываю TimesheetSubmissionNotifier.send_submission_reminders через тест rspec, UserMailer.submission_reminder(user) возвращает ноль.

Если я вызываю UserMailer.submission_reminder(user) непосредственно из теста rspec,он возвращает почтовое сообщение, как и ожидалось.

Вот только строки, связанные с ActionMailer, в моем config / environment / test.rb:

config.action_mailer.delivery_method = :test 
config.action_mailer.default_url_options = { :host => 'localhost:3000' }

Есть идеи, почему метод возвращает nil?

1 Ответ

16 голосов
/ 28 марта 2012

Для тех, у кого похожая проблема, я обнаружил проблему.

Я использовал ожидание should_receive RSpec, которое, как я не осознавал, фактически создало макет класса, в который он помещен.Поэтому я полностью высмеивал класс UserMailer, что означало, что он никогда не достигал реального класса UserMailer.

Я не мог заставить его работать, используя фиктивные функции, поэтому вместо этого я изменил свой тест, чтобы посмотреть на хранилище UserMailer.deliveries и проверить, что туда помещается нужное количество сообщений и что ониотправлено на нужные адреса электронной почты.

...