Спецификация электронной почты не соответствует содержанию тела в Rails - PullRequest
3 голосов
/ 19 апреля 2011

Я использую гем email_spec для проверки простой электронной почты, но по какой-то причине содержимое тела кажется пустым:

  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 ]

6 голосов
/ 02 марта 2012

Лучший способ сделать это:

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

Вы также можете использовать text_part вместо html_part, если хотите проверить текстовую часть составного сообщения.

Также обратите внимание, что другие могут рекомендовать использовать #encoded, но у меня возникли проблемы с использованием этого с длинными URL-адресами, так как они могут быть перенесены в строку во время процесса кодирования.

0 голосов
/ 11 апреля 2013

Итак, я испытывал то же самое. Я пытался проверить свои почтовые программы без загрузки всех 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
...