Как проверить заголовки писем с помощью RSpec - PullRequest
16 голосов
/ 20 декабря 2011

Я использую SMTP API SendGrid в своем приложении Rails для отправки электронных писем.Тем не менее, я сталкиваюсь с проблемами при тестировании заголовка электронного письма («X-SMTPAPI») с использованием RSpec.

Вот как выглядит электронное письмо (получение из 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"] 

, чтобы получить массив адресов электронной почты.

1 Ответ

11 голосов
/ 20 декабря 2011

В геме email_spec есть куча соответствий, которые делают это проще, вы можете делать такие вещи, как

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

И если вы перенимаете источник этого драгоценного камня, это должно указывать вам правильное направление, если вы не хотите его использовать, например,

mail.to.addrs

возвращает вам адреса электронной почты (в отличие от таких вещей, как «Боб»)

и

mail.header['foo']

возвращает вам поле для заголовка foo (в зависимости от того, что вы проверяете, вы можете вызвать to_s для получения действительного значения поля)

...