Rails - 如何测试ActionMailer发送的特定附件?

Jor*_*ein 28 unit-testing actionmailer ruby-on-rails-3 ruby-on-rails-3.2

在我的ActionMailer :: TestCase测试中,我期待:

@expected.to      = BuyadsproMailer.group_to(campaign.agency.users)
@expected.subject = "You submitted #{offer_log.total} worth of offers for #{offer_log.campaign.name} "
@expected.from    = "BuyAds Pro <feedback@buyads.com>"
@expected.body    = read_fixture('deliver_to_agency')

@expected.content_type = "multipart/mixed;\r\n boundary=\"something\""
@expected.attachments["#{offer_log.aws_key}.pdf"] = {
  :mime_type => 'application/pdf',
  :content => fake_pdf.body
}
Run Code Online (Sandbox Code Playgroud)

并将我的邮件发送给我以获取fake_pdf,而不是通常从S3获取的真实PDF,以便我确定PDF的正文匹配.

但是,我收到这个长时间的错误,告诉我一封电子邮件是预期的,但收到的电子邮件略有不同:

<...Mime-Version: 1.0\r\nContent-Type: multipart/mixed\r\nContent-Transfer-Encoding: 7bit...> expected but was
<...Mime-Version: 1.0\r\nContent-Type: multipart/mixed;\r\n boundary=\"--==_mimepart_50f06fa9c06e1_118dd3fd552035ae03352b\";\r\n charset=UTF-8\r\nContent-Transfer-Encoding: 7bit...>
Run Code Online (Sandbox Code Playgroud)

我不匹配生成的电子邮件的字符集或部分边界.

如何定义或存储我预期的电子邮件的这一方面?

Rom*_*man 46

这是我从特定附件的rspec测试中复制的示例,希望它有所帮助(可以通过调用邮件程序方法创建邮件或在调用.deliver后查看交付数组):

  mail.attachments.should have(1).attachment
  attachment = mail.attachments[0]
  attachment.should be_a_kind_of(Mail::Part)
  attachment.content_type.should be_start_with('application/ics;')
  attachment.filename.should == 'event.ics'
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案.检查结果是一种`Mail :: Part`似乎是不必要的,如果在未来版本的Rails中类名不同,可能会使测试不必要地变得脆弱.如果对象的类型不正确,那么它响应`content_type`和`filename`方法的可能性非常低. (2认同)
  • 您还可以测试附件的内容:`expect(attachment.body).to eq fake_pdf.body` (2认同)

Adv*_*bly 5

我有类似的东西,我想检查附加的 csv 内容。我需要这样的东西,因为它看起来像是\r为换行符插入的:

expect(mail.attachments.first.body.encoded.gsub(/\r/, '')).to(
  eq(
    <<~CSV
      "Foo","Bar"
      "1","2"
    CSV
  )
) 
Run Code Online (Sandbox Code Playgroud)