3

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

2 回答 2

8

我发现这样做的最好方法是:

it "contains a greeting" do
  mail.html_part.body.should match /Hi/
end

如果要检查多部分消息的纯文本部分,也可以使用text_part代替。html_part

另请注意,其他人可能会推荐使用#encoded,但我在使用长 URL 时遇到了麻烦,因为它们可能在编码过程中被换行。

于 2012-03-02T17:03:02.667 回答
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
于 2013-04-10T23:32:38.350 回答