我正在使用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
答案 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消息,这非常令人困惑。看着你的规格让我意识到我忘了它。谢谢!