前几天用assert_select_email来测试邮件内容:
程序在第一行中断,里面的断言并没有被执行,于是查看源码并调试:
发现parts为空,原来这个断言只适用于multipart邮件,对于其它类型的邮件就束手无策了。上网查一下,给出这种方案,重写此方法:
当然,邮件内要有根节点,不然又会报错。
如果只想测试text/plain类型的邮件,可以在setup方法中加入:
就写这么多了,欢迎补充挑错
assert_select_email do
items = assert_select "ol>li"
items.each do
# Work with items here...
end
end
程序在第一行中断,里面的断言并没有被执行,于是查看源码并调试:
def assert_select_email(&block)
deliveries = ActionMailer::Base.deliveries
assert !deliveries.empty?, "No e-mail in delivery list"
for delivery in deliveries
for part in delivery.parts
if part["Content-Type"].to_s =~ /^text\/html\W/
root = HTML::Document.new(part.body).root
assert_select root, ":root", &block
end
end
end
end
发现parts为空,原来这个断言只适用于multipart邮件,对于其它类型的邮件就束手无策了。上网查一下,给出这种方案,重写此方法:
def assert_select_email(&block)
deliveries = ActionMailer::Base.deliveries
assert !deliveries.empty?, "No e-mail in delivery list"
for delivery in deliveries
for part in delivery.parts.empty? ? [delivery] : delivery.parts.select{|p| p["Content-Type"].to_s =~ /^text\/html\W/}
root = HTML::Document.new(part.body).root
assert_select root, ":root", &block
end
end
end
当然,邮件内要有根节点,不然又会报错。
如果只想测试text/plain类型的邮件,可以在setup方法中加入:
ActionMailer::Base.deliveries.clear #不清空的话,你得到的永远是第一个测试的邮件
@emails = ActionMailer::Base.deliveries
测试内容:
assert_equal 1, @emails.size
email = @emails.first
assert_equal 'abc@example.com', email.to[0] #测收件人地址
assert_match /your new password is/, email.body #测邮件内容
就写这么多了,欢迎补充挑错