16

次のようにメールインターセプターを使用しています。

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

rake 仕様では発生しないため、このインターセプターの rspec を作成できません。

私は次の仕様を持っています:

  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 を見ると、deliver_to がインターセプターではないことがわかります。インターセプターの rspec を作成する方法についてのアイデアはありますか?

ありがとう

4

1 に答える 1

13

の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('xxxxx@xxxxxx.com')
end

もう1つのオプションは、メッセージを通常どおりに配信し、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

両方のテストを使用することをお勧めします。最初のテストでは、MailInterceptor期待どおりにメッセージが変更されていることを確認します。2番目のテストは、より統合テストでありMailInterceptor、配信システムに接続されたテストです。

于 2011-10-08T00:55:03.490 に答える