我正在使用email_spec gem测试一个简单的电子邮件,但由于某种原因,正文内容似乎是空的:
1) ContactMailer welcome email to new user renders the body
Failure/Error: mail.should have_body_text("Hi")
expected the body to contain "Hi" but was ""
# ./spec/mailers/contact_mailer_spec.rb:17:in `block (3 levels) in <top (required)>'
其他每个例子都过去了。模板文件名为welcome_email.text.erb
。不确定为什么身体不匹配,但电子邮件在发送时确实有一个正文。
编辑:Rspec代码是:
let(:mail) { ContactMailer.welcome_email(email) }
it "renders the body" do
mail.should have_body_text("Hi")
end
答案 0 :(得分:6)
我发现这样做的最好方法是:
it "contains a greeting" do
mail.html_part.body.should match /Hi/
end
如果要检查多部分邮件的纯文本部分,也可以使用text_part
代替html_part
。
另请注意,其他人可能会建议使用#encoded
,但我在使用长网址时遇到问题,因为它们可能会在编码过程中被换行。
答案 1 :(得分:0)
所以,我遇到了同样的事情。我试图在不加载所有Rails的情况下测试我的邮件程序。
最终解决了我的问题是将其添加到我的测试中: (请注意,我的测试是在test / unit / mailers / my_mailer_test.rb中 - 您可能需要调整路径)
ActionMailer::Base.delivery_method = :test
ActionMailer::Base.view_paths = File.expand_path('../../../../app/views', __FILE__)
基本上,如果视图路径没有指向您的视图目录,则找不到模板,并且所有部分(html,文本等)都是空白的。
注意:指定的目录不是实际模板所在的目录。邮件程序知道在模板根目录中查找以类本身命名的目录。
以下是minitest / spec
中的示例require 'minitest/spec'
require 'minitest/autorun'
require "minitest-matchers"
require 'action_mailer'
require "email_spec"
# NECESSARY TO RECOGNIZE HAML TEMPLATES
unless Object.const_defined? 'Rails'
require 'active_support/string_inquirer'
class Rails
def self.env
ActiveSupport::StringInquirer.new(ENV['RAILS_ENV'] || 'test')
end
end
require 'haml/util'
require "haml/template"
end
# END HAML SUPPORT STUFF
require File.expand_path('../../../../app/mailers/my_mailer', __FILE__)
ActionMailer::Base.delivery_method = :test
ActionMailer::Base.view_paths = File.expand_path('../../../../app/views', __FILE__)
describe MyMailer do
include EmailSpec::Helpers
include EmailSpec::Matchers
let(:the_email){ MyMailer.some_mail() }
it "has the right bit of text" do
the_email.must have_body_text("some bit of text")
end
end