【问题标题】:Writing tests for mailer rails为 mailer rails 编写测试
【发布时间】:2013-11-07 21:11:50
【问题描述】:

我正在尝试测试一个邮件发送方法,它应该只向经过验证的用户发送邮件。

所以我的邮件中有这样的方法:

def send_hints(user)
    @user = user
    mail :to => user.email, :subject => "Your hints for the day"
end

我正在努力确保只有经过验证的用户才能收到此信息。所以 user.verified_at 不是 null/nil。

现在开始写测试:

describe "Emails should be sent only to verified user"
  let(:user) { FactoryGirl.create(:user, :verified_at => DateTime.now) }
  let(:mail) { UserMailer.send_hints(user) }
...

我不确定在这里断言什么是明智的? 如果我以相反的方式发送邮件,则应该发送或不发送邮件。

【问题讨论】:

  • 电子邮件何时发送?创建用户后?经过一些动作?您应该测试一下,当该操作对经过验证的用户完成时,UserMailer 会收到用户的“send_hints”,并且在同一操作中,如果用户未经过验证,则 UserMailer 不会收到该方法调用。目前尚不清楚何时会为您提供更多帮助。

标签: ruby-on-rails ruby rspec


【解决方案1】:

这是一种测试方法:

# config/environments/test.rb
YourApplication::Application.configure do
  config.action_mailer.delivery_method = :test
end


# spec/your_spec.rb
describe 'Emails should be sent only to verified user' do
  let(:user) { FactoryGirl.create(:user, verified_at: verified_at) }
  before { UserMailer.send_hints(user) }
  subject { ActionMailer::Base.deliveries.last.to }
  context 'When the user is verified' do
    let(:verified_at) { DateTime.now }
    it { should include(user.email) }
    end
  end

  context 'When the user is not verified' do
    let(:verified_at) { nil }
    it { should_not include(user.email) }
  end
end

【讨论】:

    【解决方案2】:

    action mailer 是一个执行任何逻辑的糟糕地方,因为它具有类的奇怪组合,例如方法、实例上不可访问的访问器等。编写一个演示者类,可以检查是否发送mail 并使用该演示者类在邮件程序中执行用户的任何特定表示。您可以像测试普通对象一样在邮件程序的概念之外测试演示者。

    class HintMailerPresenter
      def initialize(user)
        @user = user
      end
    
      def verified?
        user.whatever and whatever
      end
    end
    
    # in you controller/mail sending location
    
    @presenter = HintMailPresenter.new(user)
    Mailer.send_hints(@presenter).deliver if @presenter.verified?
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 2011-02-23
      • 2012-05-17
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多