2016-05-05 2 views
1

いくつかの状況で電子メールを送信するRailsアプリケーションをテストしました。それはAPIです。電子メールをテストする際に、Railsの自動クリーニングクラス変数を防ぐ方法はありますか?

私はAirborne gemを使用しています。これはAPIテストを非常に簡単にします。私は電子メール配信をテストしなければならない時を除いて、すべて正しいものでした。私は、次のことを試してみました:

it "blah" do 
    //Code that makes my API send an email 
    puts ActionMailer::Base.deliveries.inspect 
end 

しかしdeliveries配列は常に空です。私もEmails.deliveries.inspectで試しました。メールはActionMailer::Baseを継承したカスタムメーラーです。

私はActionMailerのAPIドキュメントを読み終え、インターセプタコンセプトを満たしました。インターセプタは:testで動作しませんので、:smtpに切り替えました。実際、電子メールは正しく送信されていますが、期待通りのテストではアクセスできません。

私のインターセプタコードは今、この権利

initializers/email_interceptor.rb 

class EmailInterceptor 

    @@msgs = []  

    def self.delivering_email(message) 
    puts message 
    //Rails.logger.debug "Email being sent: " + message.to_s 
    @@msgs << message 
    Rails.logger.debug "Actual messages array: #{@@msgs}" 
    end 

    def self.msgs 
    @@msgs 
    end 
end 

ActionMailer::Base.register_interceptor(EmailInterceptor) 

すべてOKです。デバッグメッセージは配列が正しく表示されるように表示します。しかし、変数は私のテストステートメントが実行される前に消去されます。 EDIT:テストスイートを実行すると、上記のコードが実行されます。しかし変数はテスト自体からアクセスされていません。

//test code 
puts EmailInterceptor.msgs.inspect 
=> [] 

この現象を防止する方法はありますか?

+1

あなたは 'Rails.logger.debug 'を意味しましたか?実際のメッセージ配列:#{@@ msgs}" '? –

+0

はい、申し訳ありません。一定。 –

答えて

0

test.rbの設定にconfig.action_mailer.perform_deliveries = falseがある可能性があります。 config.action_mailer.delivery_method = :testを実際に使用する必要があるようです。ActionMailer::Base.deliveriesを入力すると、テストがより簡単で信頼性が高くなります。本当にテストのためのインターセプタが必要ですか?

+0

私の 'test.rb'環境ファイルに' config.action_mailer.perform_deliveries = false'がありません。実際、明示的にその値をtrueにしてみたところ、テストの 'it'ブロックからアクセスすると' ActionMailer :: Base.deliveries'も空です。 –

+0

あなたがテストで 'config.action_mailer.delivery_method =:smtp'をなぜ必要とするのか不思議です。なぜ 'config.action_mailer.delivery_method =:test'を使わないのですか? –

+0

私は 'config.action_mailer.delivery_method =:smtp'を使用しました。なぜなら、インターセプタの問題を解決しようとしたからです。値が ':test'に設定されていると、電子メールは実際に配信されておらず、インターセプタコードは呼び出されません。 –

関連する問題