如何使用RSpec测试电子邮件标头

时间:2011-12-20 08:25:30

标签: ruby-on-rails rspec ruby-on-rails-3.1 rspec-rails sendgrid

我在我的Rails应用程序中使用SendGrid的SMTP API来发送电子邮件。但是,我遇到了使用RSpec测试电子邮件标题(“X-SMTPAPI”)的麻烦。

这是电子邮件的样子(从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"] 

检索电子邮件地址数组。

2 个答案:

答案 0 :(得分:11)

email_spec gem有一堆匹配器使这更容易,你可以做像

这样的事情
mail.should have_header('X-SMTPAPI', some_value)
mail.should deliver_to('foo@bar.com')

如果您不想使用它,那么仔细阅读该宝石的来源应该指向正确的方向,例如。

mail.to.addrs

返回电子邮件地址(与'Bob'相反)

mail.header['foo']

获取foo标题的字段(取决于您检查的内容,您可能需要在其上调用to_s以获取实际字段值)

答案 1 :(得分:0)

使用更现代的rspec语法在此处重复其他一些建议:

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