19 votes

Comment tester les en-têtes de courriel à l'aide de RSpec

J'utilise la méthode de SendGrid API SMTP dans mon application Rails pour envoyer des emails. Cependant, j'ai des difficultés à tester l'en-tête de l'email ("X-SMTPAPI") en utilisant RSpec.

Voici à quoi ressemble l'e-mail (extrait de 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"]}>> 

Voici mon code de spécification (qui a échoué) :

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

J'ai également essayé diverses méthodes pour récupérer l'en-tête ("X-SMTPAPI") et cela n'a pas fonctionné non plus :

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

Aide ?

Mise à jour (réponse)

Il s'avère que je peux faire ça pour récupérer la valeur de l'en-tête de l'email :

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

Cependant, la valeur renvoyée est au format JSON. Il me suffit donc de la décoder :

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

qui renvoie un hash, où je peux faire ça :

sendgrid_header["to"] 

pour récupérer le tableau d'adresses électroniques.

12voto

Frederick Cheung Points 38410

La gemme email_spec dispose d'un certain nombre de correspondances qui facilitent cette tâche, vous pouvez faire des choses comme

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

Et la consultation des sources de cette gemme devrait vous mettre sur la bonne voie si vous ne voulez pas l'utiliser, par exemple.

mail.to.addrs

vous renvoie les adresses de courrier électronique (par opposition à des choses comme 'Bob ')

et

mail.header['foo']

vous donne le champ pour l'en-tête foo (selon ce que vous vérifiez, vous pouvez appeler to_s sur celui-ci pour obtenir la valeur réelle du champ)

0voto

David Hempy Points 1199

Je répète certains des autres conseils donnés ici, dans une syntaxe rspec plus moderne :

RSpec.describe ImportFile::Mailer do
  describe '.file_error' do
    let(:mail) { described_class.file_error('daily.csv', 'missing header') }

    it { expect(mail.subject).to eq("Import error: missing header in daily.csv") }
    it { expect(mail.header['X-source-file'].to_s).to eq ('daily.csv') }
  end
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X