2015-04-20 2 views
3

у меня в RSpec тест такого сравнения:Действия проверка почтовой ссылки в RSpec

expect(new_mail.body.encoded).to match(url_for(controller:'some_controller',action:'some_action',some_param:some_param)) 

, но он не потому, что ActionMailer кодирует HTML тела что-то вроде этого:

+<a href=3D"http://localhost:3000/some_controller/some_action/wgt1p468ersmkq= 
    +gbvmfv5wgmifj13u894dfjrhc0hzczk71pcw3hrk5907iqfolc6onhxvik6apuuwgm1rng7ro= 
    +rt8qih43thql3spyp5ajjdugy9jvx0xc5hvpi015z" style=3D"display: inline-block= 
    +; background-color: #71B344; color: #FFF; border-radius: 4px; font-weight= 
    +: bold; text-decoration: none; padding: 6px 12px; white-space: nowrap"> 
    +  Go to Your Account 
    +  </a> 

как сравнить ожидаемую ссылку и закодированная ссылка в теле письма?

ответ

4

Вместо этого вы можете использовать new_mail.body.to_s, чтобы получить незашифрованную версию, указанную в Guide to Rails Testing.

Также вы можете использовать Capybara сделать утверждение о оказанной электронной почте (или any html fragment), что лучше, чем просто с помощью строки соответствует, если вы действительно хотите, чтобы убедиться, что ссылка там:

let(:email){ Capybara::Node::Simple.new(new_mail.body.to_s) } 

it "has a link" do 
    url = url_for(controller:'some_controller',action:'some_action',some_param:some_param) 
    expect(email).to have_link('A link', href: url) 
end 

Добавлено:

Чтобы получить правильную часть из нескольких частей электронной почты:

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

let(:email) { Capybara::Node::Simple.new(get_message_part(new_mail, /html/)) } 
+0

new_mail.body.to_s возвращает пустую строку, есть несколько прикрепленных файлов в сообщении электронной почты –

+0

Ах забыл про эти досадные многопользовательские письма. – max

+0

Добавлено объяснение того, как обрабатывать многопользовательские письма – max

Смежные вопросы