19

Rails アプリケーションでSendGrid のSMTP APIを使用してメールを送信しています。しかし、RSpec を使用して電子メール ヘッダー (「X-SMTPAPI」) をテストする際に問題が発生しています。

メールは次のようになります (ActionMailer::Base.deliveries から取得):

#<Mail::Message:2189335760, Multipart: false, Headers: 
<Date: Tue, 20 Dec 2011 16:14:25 +0800>, 
<From: "Acme Inc" <contact@acmeinc.com>>, 
<To: doesntmatter@nowhere.com>, 
<Message-ID: <4ef043e1b9490_4e4800eb1b095f1@Macbook.local.mail>>, 
<Subject: Your Acme order>, <Mime-Version: 1.0>, 
<Content-Type: text/plain>, <Content-Transfer-Encoding: 7bit>, 
<X-SMTPAPI: {"sub":{"|last_name|":[Foo],"|first_name|":[Bar]},"to":["foo@bar.com"]}>> 

これが私の仕様コードです(失敗しました):

ActionMailer::Base.deliveries.last.to.should include("foo@bar.com")

ヘッダーを取得するためのさまざまな方法(「X-SMTPAPI」)も試しましたが、どちらも機能しませんでした:

mail = ActionMailer::Base.deliveries.last
mail.headers("X-SMTPAPI") #NoMethodError: undefined method `each_pair' for "X-SMTPAPI":String

ヘルプ?

更新(回答)

結局のところ、これを実行してメールヘッダーの値を取得できます。

mail.header['X-SMTPAPI'].value

ただし、返される値は JSON 形式です。次に、それをデコードするだけです。

sendgrid_header = ActiveSupport::JSON.decode(mail.header['X-SMTPAPI'].value)

これはハッシュを返します。ここでこれを行うことができます:

sendgrid_header["to"] 

メールアドレスの配列を取得します。

4

2 に答える 2

12

email_spec gem には、これを簡単にするマッチャーがたくさんあります。次のようなことができます。

mail.should have_header('X-SMTPAPI', some_value)
mail.should deliver_to('foo@bar.com')

そして、それを使用したくない場合は、その宝石のソースを熟読することで正しい方向に進むはずです。

mail.to.addrs

メールアドレスを返します(「ボブ」などとは対照的に)

mail.header['foo']

foo ヘッダーのフィールドを取得します (チェック内容によってはto_s、実際のフィールド値を取得するために呼び出すことができます)

于 2011-12-20T10:14:56.180 に答える