如何为邮件拦截器编写RSpec?

AnA*_*ice 16 rspec ruby-on-rails ruby-on-rails-3 email-spec

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

为setup_mail.rb

Mail.register_interceptor(MailInterceptor) if Rails.env != "production" 
Run Code Online (Sandbox Code Playgroud)

class MailInterceptor

class MailInterceptor  
  def self.delivering_email(message)  
    message.subject = "#{message.subject} [#{message.to}]"
    message.to = "xxxxx@xxxxxx.com"
  end
end
Run Code Online (Sandbox Code Playgroud)

我无法为这个拦截器创建一个rspec,因为rake规范不会发生这种情况.

我有以下规格:

  describe "MailInterceptor" do 
    it "should be intercepted" do
      @email = UserMailer.registration_automatically_generated(@user)
      @email.should deliver_to("xxxxx@xxxxxx.com")      
    end
  end
Run Code Online (Sandbox Code Playgroud)

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

谢谢

dan*_*ich 13

email_spec匹配器deliver_to实际上并不通过典型的传递方法运行邮件消息,它只是检查邮件的发送方式.

要测试拦截器,可以直接调用deliver_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('xxxxx@xxxxxx.com')
end
Run Code Online (Sandbox Code Playgroud)

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

it 'should intercept delivery' do
  reset_mailer
  UserMailer.registration_automatically_generated(@user).deliver
  last_email_sent.should deliver_to('xxxxx@xxxxxx.com')
end
Run Code Online (Sandbox Code Playgroud)

使用这两个测试可能是一个好主意,第一个确保MailInterceptor正在改变消息,正如您所期望的那样.第二个测试更多的是集成测试,测试MailInterceptor连接到交付系统.