代码之家  ›  专栏  ›  技术社区  ›  BvuRVKyUVlViVIc7

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

  •  8
  • BvuRVKyUVlViVIc7  · 技术社区  · 14 年前

    我使用rspec,当我运行rake spec时,用户mailer通过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 回复  |  直到 14 年前
        1
  •  15
  •   BvuRVKyUVlViVIc7    14 年前

    我真傻。。。在我的setup-mail.rb初始值设定项中有“ActionMailer::Base.delivery\u method=:smtp”。。。啊啊。。。。

        2
  •  8
  •   Conner Smith    11 年前

    在config/environments/test.rb中,默认情况下应该有 config.action_mailer.delivery_method = :test

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

    config.action_mailer.delivery_method = :smtp ,这可能会覆盖以前的传递方法=:test;因此 ActionMailer::Base.deliveries

    我在使用MailCatcher查看发送的电子邮件时确实做到了这一点,因此导致我的测试失败,即使我确信电子邮件是正确发送的!

    顺便说一句:如果你正在使用设备,你可能需要检查 Devise.mailer.deliveries 而是数组。

        3
  •  2
  •   bfcoder    9 年前

    就我而言

    config.action_mailer.delivery_method = :test
    

    config.action_mailer.perform_deliveries = false
    

    实际上(我想)它不会发送邮件也不会把它塞进 ActionMailer::Base.deliveries

        4
  •  0
  •   brntsllvn    9 年前

    另一个可能的问题是…不要像我一样犯错误,包括

    ActionMailer::Base.delivery_method = :smtp
    

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

        5
  •  0
  •   Ka Mok    8 年前

    对我来说,我忘了 .deliver 方法在我的 spec.rb