2011-12-20 32 views
14

Tôi đang sử dụng số SMTP API của SendGrid trong ứng dụng Rails của tôi để gửi email. Tuy nhiên, tôi đang gặp rắc rối khi kiểm tra tiêu đề email ("X-SMTPAPI") bằng cách sử dụng RSpec.Cách kiểm tra tiêu đề email bằng cách sử dụng RSpec

Đây là những gì những email trông giống như (lấy từ 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]"]}>> 

Dưới đây là mã của tôi spec (mà thất bại):

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

Tôi cũng đã thử khác nhau để lấy tiêu đề ("X-SMTPAPI") và không hoạt động:

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

Trợ giúp?

Cập nhật (câu trả lời)

Hóa ra, tôi có thể làm điều này để lấy giá trị của tiêu đề email:

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

Tuy nhiên, giá trị trả về là ở định dạng JSON. Sau đó, tất cả những gì cần làm là để giải mã nó:

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

mà trả về một băm, nơi tôi có thể làm điều này:

sendgrid_header["to"] 

để lấy mảng các địa chỉ email.

Trả lời

9

Các đá quý email_spec có một loạt các quẹt mà làm này dễ dàng hơn, bạn có thể làm những thứ như

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

Và perusing nguồn đến đá quý nên chỉ cho bạn đi đúng hướng nếu bạn không muốn sử dụng nó ví dụ

mail.to.addrs 

trả về cho bạn địa chỉ email (như trái ngược với thứ như 'Bob')

mail.header['foo'] 

giúp bạn lĩnh vực này trong tiêu đề foo (tùy thuộc vào những gì bạn đang kiểm tra bạn có thể muốn gọi số to_s trên đó để nhận giá trị thực tế của trường)

+0

Cảm ơn. Tôi đã kiểm tra email_spec gem. Matcher "deliver_to" tương tự như matcher "to" (trả về "[email protected]" thay vì "[email protected]") và matcher "has_header" đơn giản trả về tiêu đề đầy đủ. Dù sao, tôi đã tìm ra một giải pháp cho điều này và sẽ đăng nó lên ngay bây giờ. Cảm ơn! –

Các vấn đề liên quan