电子邮件规范与Rails中的正文内容不匹配

时间:2011-04-18 20:35:11

标签: ruby-on-rails email rspec email-spec

我正在使用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

2 个答案:

答案 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