Как проверить заголовки электронной почты, используя RSpec

Я использую SendGrid SMTP API в приложении 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" <[email protected]>>, 
<To: [email protected]>, 
<Message-ID: <[email protected]>>, 
<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":["[email protected]"]}>> 

Здесь мой код спецификации (который не удалось):

ActionMailer::Base.deliveries.last.to.should include("[email protected]")

Я также попробовал различный метод для извлечения заголовка ( "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

В почтовом ящике mail_spec есть множество помощников, которые делают это проще, вы можете делать такие вещи, как

mail.should have_header('X-SMTPAPI', some_value)
mail.should deliver_to('[email protected]')

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

mail.to.addrs

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

и

mail.header['foo']

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