RSpec отправляет электронные письма (не хранятся в ActionMailer :: Base.deliveries) - не знаете почему? - PullRequest
8 голосов
/ 22 октября 2010

Я использую rspec, и когда я запускаю rake spec, почтовый пользователь отправляет электронную почту через smtp, а не сохраняет электронную почту в массиве ActionMailer :: Base.deliveries (вызывается наблюдателем пользователя) ...

Не могли бы вы дать мне подсказку, почему?

# 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-файлы:

# 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 ]

14 голосов
/ 22 октября 2010

Я такой тупой ... у меня было "ActionMailer :: Base.delivery_method =: smtp" в моем setup_mail.rb-initializer ... AAARGH ....

8 голосов
/ 14 декабря 2013

Более подробно рассмотрим решение этой проблемы:

В вашем config / enviroments / test.rb по умолчанию у вас должна быть строка config.action_mailer.delivery_method = :test

То, что это делает, говорит ActionMailer не отправлять электронную почту в обычном режиме, а скорее сохранять отправленную электронную почту в массиве ActionMailer::Base.deliveries. Это полезно для тестирования, поскольку вы можете определить, сколько электронных писем было отправлено с помощью метода inspect, count, length в массиве ActionMailer :: Base.deliveries.

Однако, если вы установите метод доставки, например, config.action_mailer.delivery_method = :smtp, это может перезаписать ваш предыдущий delivery_method =: test; следовательно, ваш ActionMailer::Base.deliveries не будет заполнен.

Я сделал именно это, используя MailCatcher для просмотра отправляемых писем, в результате чего мои тесты не прошли, хотя я был уверен, что письма отправлялись правильно!

Итак, убедитесь, что вы не устанавливаете метод delivery_method, кроме: test, в своей тестовой среде.

В качестве примечания: если вы используете Devise, вы можете вместо этого проверить массив Devise.mailer.deliveries.

2 голосов
/ 13 августа 2015

В моем случае у меня было

config.action_mailer.delivery_method = :test

, и у меня также было

config.action_mailer.perform_deliveries = false

, которое в действительности (я полагаю) не отправляет электронное письмо, а также не заполняет егов массив ActionMailer::Base.deliveries.

0 голосов
/ 28 сентября 2016

В моем случае, я забыл .deliver метод внутри моего spec.rb. Это странно, однако, я получаю сообщение STDOUT от Rails (Rails 5) о «электронной почте доставлено» даже без него, что было довольно странно. Глядя на вашу спецификацию, я понял, что забыл. Спасибо!

0 голосов
/ 12 ноября 2015

Еще одна возможная ошибка ... не делайте ошибку, как я, включая

ActionMailer::Base.delivery_method = :smtp

в config / environment.rb, который, как я неправильно полагал, будет переопределен более конкретным config / environment / test.rb Удаление вышеуказанной строки из config / environment.rb устранило проблему для меня.

...