Как проверить заголовки электронной почты, используя 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
на нем, чтобы получить фактическое значение поля)