Soru RSMec ile ActionMailer multipart e-postalarını test etme


Şu anda postalamacılarımı RSpec ile test ediyorum, ancak Rails Kılavuzları bölümünde açıklandığı gibi çok parçalı e-postalar oluşturmaya başladım: http://guides.rubyonrails.org/action_mailer_basics.html#sending-multipart-emails

Her iki mailer şablonunda da metin ve html formatları var ama testlerimin sadece HTML kısmını kontrol ediyor gibi görünüyor. Metin şablonunu ayrı ayrı kontrol etmenin bir yolu var mı?

Yalnızca HTML görünümünü kontrol ediyor, çünkü bu varsayılan sırada ilk sırada mı?


30
2018-06-27 00:13


Menşei




Cevaplar:


Nilmethod'un mükemmel yanıtını tamamlamak için, paylaşılan bir örnek grubu kullanarak hem metin hem de html sürümlerini test ederek özelliklerinizi temizleyebilirsiniz:

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

32
2017-08-03 22:48



Kullanabilirsiniz mail.text_part.body.raw_source & mail.html_part.body.raw_source yerine get_message_part. - nitsas


Bu normal ifadelerle test edilebilir.

HTML bölümünde bulunan şeyleri bulma (# ile eşleşecek şekilde kullanın):

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

Düz metin bölümünde bulunan şeyleri bulma (# ile eşleşecek şekilde kullanın):

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

Gerçekten de, çok parçalı bir mesaj oluşturduğunu kontrol etmek:

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 

26
2017-07-05 20:43



Kullanabilirsiniz mail.text_part ve mail.html_part yerine mail.body.parts.find { ... }. - nitsas
text_part ve html_part Diğer parçaların içinde olsalar bile ilgili parçaları buldukları için tercih edilirler. mail.all_parts sadece mail.parts (ve all_parts her parça içindeki parçaları sırayla alır) - Ollie H-M


İşleri daha da basitleştirmek için kullanabilirsiniz

message.text_part    and
message.html_part

ilgili parçaları bulmak için. Bu, ekleri olan yapılandırılmış çok parçalı / alternatif mesajlar için bile çalışır. (Rails 3.0.14 ile Ruby 1.9.3 üzerinde test edilmiştir.)

Bu yöntemler, ilgili mesaj bölümlerini bulmak için bir çeşit sezgisel kullanır, bu yüzden mesajınız birden fazla metin parçasına sahipse (örneğin, Apple Mail bunları oluşturduğunda) "doğru şeyi" gerçekleştiremez.

Bu, yukarıdaki yöntemi değiştirir

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

Hem düz metin (çoktan seçmeyen) mesajlar hem de çok parçalı mesajlar için çalışır ve tüm mesaj gövdelerini belirli bir düzenli ifadeye karşı test eder.

Şimdi, herhangi bir gönüllü bu "gerçek" bir RSpec maççı yapmak için? :) Gibi bir şey

@mail.bodies_should_match /foobar/

çok daha güzel olurdu ...


23
2017-10-28 11:23





E-postanız ekleri içeriyorsa ve html parçaları bir multipart/alternative Bölüm. Bu altta belirtilmiştir Raylarda Eklerle Eposta Gönderme 3 Kılavuz.

Bunu işlemek için önce basitleştirdim get_message_part Yukarıdaki yöntem:

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

Sonra benim testimde:

multipart = get_message_part(email, /multipart/)

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

assert_match 'some string', html_body

1
2017-10-27 16:38