rspec-email — Как получить основной текст?

Я использую rspec с драгоценным камнем электронной почты. Я пытаюсь сделать:

last_delivery = ActionMailer::Base.deliveries.last
last_delivery.body.should include "This is the text of the email"

Но это не работает, есть ли способ сказать тело, текстовая версия? Тип содержимого: текст/текст?

Спасибо


person AnApprentice    schedule 21.03.2011    source источник


Ответы (8)


Тело на самом деле является экземпляром Mail::Body. Вызов raw_source должен помочь:

last_delivery = ActionMailer::Base.deliveries.last
last_delivery.body.raw_source.should include "This is the text of the email"
person Alberto F. Capel    schedule 22.03.2011
comment
Небольшое примечание: если вы используете электронные письма, состоящие из нескольких частей, вам сначала нужно выбрать правильную часть, например: last_delivery.parts.first.body.raw_source.should include "This is the text of the email" - person Pascal Lindelauf; 21.12.2011
comment
Ты просто сделал мой день @PascalLindelauf! Спасибо - person Francois; 10.02.2017
comment
Прочтите комментарий, спасите мой день :)))))))) - person truongnm; 17.03.2021

Попробовав все вышеперечисленные варианты и не заработав (Rails 3.2.13), я нашел некоторую информацию в руководстве по ruby (раздел 6 посвящен тестированию с помощью TestUnit) и заставил это работать именно так, как нужно:

last_delivery = ActionMailer::Base.deliveries.last
last_delivery.encoded.should include("This is the text of the email")

Надеюсь, это поможет!

person jeffreymatthias    schedule 11.06.2013
comment
На самом деле это может привести к сбою, если закодированная почта содержит разрывы строк, отмеченные = как Это =\nтекст электронной почты - person Alexander Presber; 13.12.2016

вы можете просто позвонить #to_s на него.

last_delivery.to_s.should include "This is the text of the email"

Для составных писем:

last_delivery.first.to_s.should include "This is the text of the email"

Протестировано и установлено, что оно работает на Rails 4

person CuriousMind    schedule 31.10.2013
comment
сообщения электронной почты, состоящие из нескольких частей, сначала необходимо выбрать правильную часть. Обновил ответ. если это не работает. Дай мне знать - person CuriousMind; 16.12.2013

Если у вас есть HTML-шаблон (example.html.erb), вы можете использовать:

last_delivery.html_part.body.to_s

Или, если у вас есть простой текстовый шаблон (example.text.erb):

last_delivery.text_part.body.to_s

Источник: В Rails почему моя почта тело пусто только в моем тесте?

person Giovanni Benussi    schedule 14.12.2017

Общий способ получить основной текст:

(mail.html_part || mail.text_part || mail).body.decoded

Если электронное письмо состоит из нескольких частей (mail.multipart?), то его mail.html_part или mail.text_part определены, в противном случае они равны нулю, а mail.body.decoded возвращает содержимое электронного письма.

Вы также можете использовать body.to_s вместо body.decoded.

person Lev Lukomsky    schedule 19.03.2019

В Rails 4 у ​​меня отлично работает значение по умолчанию last_delivery.body.should include "This is the text of the email".

person james    schedule 27.08.2014

На самом деле нет необходимости отправлять письмо, чтобы проверить содержимое. Вы можете просто проверить:

expect(YourMailer.mail_to_test.body).to include "your string"
person Markus Andreas    schedule 15.08.2019

expect(last_delivery).to have_body_text(/This is the text of the email/)

источник

person Hugo Stieglitz    schedule 02.04.2014
comment
has_body_text не является методом для электронной почты - person james; 27.08.2014