我正在使用邮件拦截器,如下所示:

setup_mail.rb

Mail.register_interceptor(MailInterceptor) if Rails.env != "production"


MailInterceptor类

class MailInterceptor
  def self.delivering_email(message)
    message.subject = "#{message.subject} [#{message.to}]"
    message.to = "[email protected]"
  end
end


我无法为此拦截器创建rspec,因为rake spec不会发生这种情况。

我有以下规格:

  describe "MailInterceptor" do
    it "should be intercepted" do
      @email = UserMailer.registration_automatically_generated(@user)
      @email.should deliver_to("[email protected]")
    end
  end


在test.log中,我看到deliver_to不是拦截器。关于如何为拦截器编写rspec的任何想法?

谢谢

最佳答案

deliver_to的email_spec匹配器实际上并不通过典型的传递方法来运行邮件,而是将simply inspects the message用于发送给谁。

要测试您的拦截器,您可以直接调用delivery_email方法

it 'should change email address wen interceptor is run' do
  email = UserMailer.registration_automatically_generated(@user)
  MailInterceptor.delivering_email(email)
  email.should deliver_to('[email protected]')
end


另一个选择是让邮件正常发送,并使用email_spec的last_email_sent测试邮件是否发送到正确的位置

it 'should intercept delivery' do
  reset_mailer
  UserMailer.registration_automatically_generated(@user).deliver
  last_email_sent.should deliver_to('[email protected]')
end


同时使用这两个测试可能是一个好主意,首先要确保MailInterceptor会按您期望的那样更改消息。第二项测试更多是集成测试,它测试MailInterceptor是否已连接到交付系统。

关于ruby-on-rails - 如何为邮件拦截器编写RSpec?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7639415/

10-13 02:09