Как написать RSpec для почтового перехватчика?

Я использую почтовый перехватчик следующим образом:

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.

У меня есть следующая спецификация:

  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 для перехватчика?

Спасибо

Ответы

Ответ 1

Соединитель email_spec для deliver_to фактически не запускает почтовое сообщение с помощью типичных методов доставки, он просто проверяет сообщение, для которого он отправляется.

Чтобы протестировать ваш перехватчик, вы можете напрямую вызвать метод delivering_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 подключено к системе доставки.