RSpec发送电子邮件(不存储在ActionMailer :: Base.deliveries中) - 不知道为什么?

时间:2010-10-22 10:38:05

标签: ruby-on-rails email ruby-on-rails-3 rspec observer-pattern

我正在使用rspec,当我运行rake规范时,用户邮件程序通过smtp发送电子邮件,而不是将电子邮件存储在ActionMailer :: Base.deliveries-array中(由用户观察者调用)......

你能给我一个暗示吗?

# Rails version
rails -v
=> Rails 3.0.1

# Ruby version with rvm (rvm version 1.0.16)
ruby -v
=> ruby 1.9.2p7 (2010-09-29 revision 29373) [x86_64-darwin10.4.0]

# Gemfile
gem "rspec-rails", ">= 2.0.1"

配置-文件:

# config/environments/test.rb
MyApp::Application.configure do
  config.action_mailer.delivery_method = :test
  config.action_mailer.raise_delivery_errors = true
end

# spec/spec_helper.rb
...
ENV["RAILS_ENV"] ||= 'test'
...

# app/models/user_observer.rb
class UserObserver < ActiveRecord::Observer
  observe User

  def after_create(record)
    puts Rails.env
    # => "test"
    UserMailer.new_user_notification(record).deliver
    puts ActionMailer::Base.deliveries.inspect
    # => []
    # Sends it via smtp!
  end
end

5 个答案:

答案 0 :(得分:14)

我太笨了......在我的setup_mail.rb-initializer中有“ActionMailer :: Base.delivery_method =:smtp”...... AAARGH ....

答案 1 :(得分:8)

详细说明这个问题的解决方案:

在您的config / enviroments / test.rb中,默认情况下您应该有一行config.action_mailer.delivery_method = :test

这样做是告诉ActionMailer不要正常发送电子邮件,而是将发送的电子邮件存储在数组ActionMailer::Base.deliveries中。这有助于测试,因为您可以通过在ActionMailer :: Base.deliveries数组上使用inspect,count,length方法来判断已经发送了多少封电子邮件。

但是,如果您将交付方式设置为config.action_mailer.delivery_method = :smtp,则可能会覆盖之前的delivery_method =:test;因此,您的ActionMailer::Base.deliveries将不会被填充。

我在使用MailCatcher查看正在发送的电子邮件时完成了此操作,从而导致我的测试失败,即使我确定电子邮件已正确发送!

因此,请确保您没有在测试环境中设置除test:test之外的delivery_method。

作为旁注:如果您使用的是Devise,则可能需要检查Devise.mailer.deliveries数组。

答案 2 :(得分:2)

就我而言,我有

config.action_mailer.delivery_method = :test

我也有

config.action_mailer.perform_deliveries = false

实际上(我认为)不会发送电子邮件,也不会将其填入ActionMailer::Base.deliveries数组。

答案 3 :(得分:0)

另一种可能的问题......不要像我一样犯错,包括

ActionMailer::Base.delivery_method = :smtp
在config / environment.rb中的

,我错误地认为它会被更具体的config / environments / test.rb覆盖。从config / environment.rb删除上面的行为我解决了问题。

答案 4 :(得分:0)

就我而言,我在.deliver内忘记了spec.rb方法。这很奇怪,但是,即使没有它,我也会从“电子邮件发送”的Rails(Rails 5)中获得STDOUT消息,这非常令人困惑。看着你的规格让我意识到我忘了它。谢谢!