Тестирование составных писем ActionMailer с помощью RSpec - PullRequest
30 голосов
/ 27 июня 2011

В настоящее время я тестирую свои почтовые программы с помощью RSpec, но я начал настраивать составные электронные письма, как описано в Руководстве по Rails: http://guides.rubyonrails.org/action_mailer_basics.html#sending-multipart-emails

У меня есть оба почтовых шаблона в текстовом и html форматах,но похоже, что мои тесты проверяют только часть HTML.Есть ли способ проверить текстовый шаблон отдельно?

Это только проверка HTML-представления, потому что оно сначала в порядке по умолчанию?

Ответы [ 4 ]

33 голосов
/ 04 августа 2011

В дополнение, отличный ответ от nilmethod, вы можете очистить свои спецификации, протестировав текстовую и html-версию, используя общую группу примеров:

spec_helper.rb

def get_message_part (mail, content_type)
  mail.body.parts.find { |p| p.content_type.match content_type }.body.raw_source
end

shared_examples_for "multipart email" do
  it "generates a multipart message (plain text and html)" do
    mail.body.parts.length.should eq(2)
    mail.body.parts.collect(&:content_type).should == ["text/plain; charset=UTF-8", "text/html; charset=UTF-8"]
  end
end

your_email_spec.rb

let(:mail) { YourMailer.action }

shared_examples_for "your email content" do
  it "has some content" do
    part.should include("the content")
  end
end

it_behaves_like "multipart email"

describe "text version" do
  it_behaves_like "your email content" do
    let(:part) { get_message_part(mail, /plain/) }
  end
end

describe "html version" do
  it_behaves_like "your email content" do
    let(:part) { get_message_part(mail, /html/) }
  end
end
27 голосов
/ 06 июля 2011

Это можно проверить с помощью регулярных выражений.

Поиск элементов в части HTML (используйте #should после этого для сопоставления):

mail.body.parts.find {|p| p.content_type.match /html/}.body.raw_source

Поиск элементов в части простого текста (используйте #should после этого для сопоставления):

mail.body.parts.find {|p| p.content_type.match /plain/}.body.raw_source

Проверка того, что оно действительно генерирует составное сообщение:

it "generates a multipart message (plain text and html)" do
  mail.body.parts.length.should == 2
  mail.body.parts.collect(&:content_type).should == ["text/html; charset=UTF-8", "text/plain; charset=UTF-8"]
end 
23 голосов
/ 28 октября 2012

Чтобы сделать вещи еще проще, вы можете использовать

message.text_part    and
message.html_part

, чтобы найти соответствующие детали.Это работает даже для структурированных многочастных / альтернативных сообщений с вложениями.(Протестировано на Ruby 1.9.3 с Rails 3.0.14.)

Эти методы используют некоторую эвристику для поиска соответствующих частей сообщения, поэтому, если ваше сообщение состоит из нескольких текстовых частей (например, так как Apple Mail их создает)он может не выполнить «правильную вещь».

Это изменит вышеуказанный метод на

def body_should_match_regex(mail, regex)
 if mail.multipart?
  ["text", "html"].each do |part|
   mail.send("#{part}_part").body.raw_source.should match(regex)
  end
 else
  mail.body.raw_source.should match(regex)
 end
end

, который работает как с обычными (не многочастными) сообщениями, так и с многочастными сообщениями и проверяет всетела сообщения против определенного регулярного выражения.

Теперь, есть какие-нибудь добровольцы, чтобы сделать из этого "настоящего" соответствия RSpec?:) Что-то вроде

@mail.bodies_should_match /foobar/

было бы намного приятнее ...

1 голос
/ 27 октября 2012

Если в вашем письме есть вложения, текстовая и html-части будут помещены в multipart/alternative -часть. Это отмечено в разделе Отправка электронных писем с вложениями в Руководстве по Rails 3 .

Чтобы справиться с этим, я сначала упростил описанный выше метод get_message_part до:

def get_message_part(mail, content_type)
  mail.body.parts.find { |p| p.content_type.match content_type }
end

Тогда в моем тесте:

multipart = get_message_part(email, /multipart/)

html = get_message_part(multipart, /html/)
html_body = html.body.raw_source

assert_match 'some string', html_body
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...