18

我将 rspec 与 email-spec gem 一起使用。我正在尝试做:

last_delivery = ActionMailer::Base.deliveries.last
last_delivery.body.should include "This is the text of the email"

但这不起作用,有没有办法说正文,文本版本?内容类型:文本/文本?

谢谢

4

8 回答 8

35

Body 实际上是一个Mail::Body实例。在它上面调用 raw_source 应该可以解决问题:

last_delivery = ActionMailer::Base.deliveries.last
last_delivery.body.raw_source.should include "This is the text of the email"
于 2011-03-22T11:31:20.590 回答
21

在尝试了上述所有选项并且未能使其正常工作(Rails 3.2.13)之后,我在ruby​​ 指南中找到了一些信息(第 6 节是关于使用 TestUnit 进行测试),并让它完全按照需要工作:

last_delivery = ActionMailer::Base.deliveries.last
last_delivery.encoded.should include("This is the text of the email")

希望有帮助!

于 2013-06-11T23:38:40.333 回答
7

如果您有一个 html 模板 ( example.html.erb ),您可以使用:

last_delivery.html_part.body.to_s

或者,如果您有纯文本 ( example.text.erb ) 模板:

last_delivery.text_part.body.to_s

资料来源:在 Rails 中,为什么我的邮件正文只在我的测试中是空的?

于 2017-12-14T02:13:33.050 回答
5

你可以打电话#to_s给它。

last_delivery.to_s.should include "This is the text of the email"

对于多部分电子邮件:

last_delivery.first.to_s.should include "This is the text of the email"

测试并发现正在使用 Rails 4

于 2013-10-31T10:55:47.013 回答
5

获取正文的通用方法:

(mail.html_part || mail.text_part || mail).body.decoded

如果电子邮件是 multipart ( mail.multipart?) 则定义其mail.html_partor mail.text_part,否则它们为 nil 并mail.body.decoded返回电子邮件的内容。

您也可以使用body.to_s代替body.decoded.

于 2019-03-19T19:29:53.920 回答
0

在 Rails 4 中,默认设置last_delivery.body.should include "This is the text of the email"对我来说很好。

于 2014-08-27T00:14:45.620 回答
0

实际上不需要发送邮件来测试内容。你可以测试:

expect(YourMailer.mail_to_test.body).to include "your string"
于 2019-08-15T14:57:09.310 回答
-2
expect(last_delivery).to have_body_text(/This is the text of the email/)

来源

于 2014-04-02T09:43:36.667 回答