2011-12-20 10 views
14

Estoy usando SMTP API de SendGrid en mi aplicación Rails para enviar correos electrónicos. Sin embargo, estoy teniendo problemas para probar el encabezado del correo electrónico ("X-SMTPAPI") usando RSpec.Cómo probar encabezados de correo electrónico usando RSpec

Aquí es lo que el correo se ve así (la recuperación de 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]"]}>> 

Aquí está mi código de especificación (que no):

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

También he intentado varias método para recuperar la cabecera ("X-SMTPAPI") y no funcionaba bien:

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

Ayuda?

Update (respuesta)

Resulta que yo puedo hacer esto para recuperar el valor de la cabecera del correo electrónico:

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

Sin embargo, el valor devuelto es en formato JSON. Entonces, todo lo que necesita hacer es decodificarlo:

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

que devuelve un hash, donde puedo hacer esto:

sendgrid_header["to"] 

para recuperar el conjunto de direcciones de correo electrónico.

Respuesta

9

La gema email_spec tiene un montón de comparadores que hacen que esto sea más fácil, puede hacer cosas como

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

y leyendo la fuente de esa gema, tiene que introducir en la dirección correcta si no desea usarlo, por ejemplo

mail.to.addrs 

le devuelve las direcciones de correo electrónico (a diferencia de cosas como 'Bob')

y

mail.header['foo'] 

te lleva al campo de la cabecera foo (dependiendo de lo que está comprobando es posible que desee llamar al to_s para obtener el valor real del campo)

+0

Gracias. Revisé la gema email_spec. El marcador "deliver_to" es similar al marcador "to" (que devuelve "[email protected]" en lugar de "[email protected]") y el marcador "have_header" simplemente devuelve el encabezado completo. De todos modos, he encontrado una solución a esto y lo publicaré ahora. ¡Gracias! –

Cuestiones relacionadas