使用 RSpec 测试 ActionMailer 多部分电子邮件(文本和 html 版本)
我目前正在使用 RSpec 测试我的邮件程序,但我已经开始设置多部分电子邮件,如 Rails 指南中所述:http://guides.rubyonrails.org/action_mailer_basics.html#sending-multipart-emails
我有两个邮件模板文本和 html 格式,但看起来我的测试只检查 HTML 部分。有没有办法单独检查文本模板?
它是否只检查 HTML 视图,因为它是默认顺序中的第一个?
I'm currently testing my mailers with RSpec, but I've started setting up multipart emails as described in the Rails Guides here: http://guides.rubyonrails.org/action_mailer_basics.html#sending-multipart-emails
I have both mailer templates in text and html formats, but it looks like my tests are only checking the HTML portion. Is there a way to check the text template separately?
Is it only checking the HTML view because it's first in the default order?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
为了补充 nilmethod 的出色答案,您可以通过使用共享示例组测试文本和 html 版本来清理规范:
spec_helper.rb
your_email_spec.rb
To supplement, nilmethod's excellent answer, you can clean up your specs by testing both text and html versions using a shared example group:
spec_helper.rb
your_email_spec.rb
这可以使用正则表达式进行测试。
在 HTML 部分中查找内容(在此之后使用 #should 进行匹配):
在纯文本部分中查找内容(在此之后使用 #should 进行匹配):
检查它是否确实生成了多部分消息:
This can be tested with regular expressions.
Finding things in the HTML portion (use #should after this to match):
Finding things in the plain text portion (use #should after this to match):
Checking that it is, indeed, generating a multipart message:
为了让事情变得更简单,您可以使用
来查找相应的部分。这甚至适用于带有附件的结构化多部分/替代消息。 (在 Ruby 1.9.3 和 Rails 3.0.14 上进行测试。)
这些方法采用某种启发式方法来查找相应的消息部分,因此如果您的消息有多个文本部分(例如 Apple Mail 创建它们),则可能无法执行“正确的事情”。
这会将上述方法更改为
适用于纯文本(非多部分)消息和多部分消息,并针对特定正则表达式测试所有消息正文。
现在,有志愿者愿意用这个制作一个“真正的”RSpec 匹配器吗? :)类似的东西
会好很多......
To make things even simpler, you can use
to find the respective parts. This works even for structured multipart/alternative messages with attachments. (Tested on Ruby 1.9.3 with Rails 3.0.14.)
These methods employ some kind of heuristic to find the respective message parts, so if your message has multiple text parts (e.g. as Apple Mail creates them) it might fail to do the "right thing".
This would change the above method to
which works for both plaintext (non-multipart) messages and multipart messages and tests all message bodies against a specific regular expression.
Now, any volunteers to make a "real" RSpec matcher out of this? :) Something like
would be a lot nicer ...
如果您的电子邮件有附件,则文本和 html 部分将最终放置在
multipart/alternative
部分中。 Rails 3 指南中的发送带有附件的电子邮件。为了解决这个问题,我首先将上面的
get_message_part
方法简化为:然后在我的测试中:
If your email has attachments the text and html parts will end be placed in a
multipart/alternative
part. This is noted on under Sending Emails with Attachments in the Rails 3 Guide.To handle this, I first simplified the
get_message_part
method above to:Then in my test:
我已经这样做了,我发现它更简单,因为除了样式和标记之外,两封电子邮件的内容都是相似的。
I have done this way, I found it simpler since the content of both emails is gonna be similar except styles and markup.