#ruby-on-rails #email #rspec #email-spec
#ruby-on-rails #Адрес электронной почты #rspec #спецификация электронной почты
Вопрос:
Я использую 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
Комментарии:
1. Где вы определяете
2. Извините, я отредактировал сообщение, чтобы прояснить это. Я определяю его в
let()
блоке.3. Все остальное соответствует, включая тему, но содержимое основного текста — нет.
4. Я тоже испытываю это. В других средах почта кажется состоящей из нескольких частей, но в тестовом режиме она поставляется в виде текста / plain, без html_part, text_part или body.
Ответ №1:
Лучший способ, который я нашел для этого, это:
it "contains a greeting" do
mail.html_part.body.should match /Hi/
end
Вы также можете использовать text_part
вместо html_part
, если хотите проверить текстовую часть составного сообщения.
Также обратите внимание, что другие могут рекомендовать использовать #encoded
, но у меня возникли проблемы с использованием этого с длинными URL-адресами, поскольку они могут переноситься в строку в процессе кодирования.
Комментарии:
1. Вот и все, спасибо! использование
html_part
— это единственное, что работает для меня.
Ответ №2:
Итак, я испытывал то же самое. Я пытался протестировать свои почтовые программы, не загружая все Rails.
Что окончательно решило мою проблему, так это добавление этого в мой тест: (обратите внимание, что мой тест находится в test / unit / mailers /my_mailer_test.rb — возможно, вам придется настроить пути)
ActionMailer::Base.delivery_method = :test
ActionMailer::Base.view_paths = File.expand_path('../../../../app/views', __FILE__)
В принципе, без путей просмотра, указывающих на ваш каталог views, шаблон не найден, и все части (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