Как написать RSpec для перехватчика почты? - PullRequest
16 голосов
/ 03 октября 2011

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

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 = "xxxxx@xxxxxx.com"
  end
end

Я не могу создать 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

В test.log я вижу, что delivery_to не является перехватчиком. Любые идеи о том, как я могу написать rspec для перехватчика?

Спасибо

1 Ответ

13 голосов
/ 08 октября 2011

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

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

Другой вариант - разрешить доставку сообщения в обычном режиме и проверить, что оно было отправлено в нужное место, используя last_email_sent

email_spec's
it 'should intercept delivery' do
  reset_mailer
  UserMailer.registration_automatically_generated(@user).deliver
  last_email_sent.should deliver_to('xxxxx@xxxxxx.com')
end

Возможно, было бы неплохо использовать оба теста, первый, чтобы убедиться, что MailInterceptor изменяет сообщение так, как вы ожидаете. Второй тест - это скорее интеграционный тест, проверяющий, что MailInterceptor подключен к системе доставки.

...