rob*_*sco 45 unit-testing ruby-on-rails actionmailer
目前在我的测试中,我做了类似的事情来测试电子邮件是否排队等待发送
assert_difference('ActionMailer::Base.deliveries.size', 1) do       
  get :create_from_spreedly, {:user_id => @logged_in_user.id}
end
但如果ia控制器动作可以发送两个不同的电子邮件,即如果注册正常则向用户发送一封电子邮件,或者如果出现问题则向管理员发送通知 - 如何测试实际发送的邮件.上面的代码无论如何都会通过.
tod*_*odd 78
从rails 3开始,ActionMailer :: Base.deliveries是一个Mail :: Message的数组.从邮件文档:
#  mail['from'] = 'mikel@test.lindsaar.net'
#  mail[:to]    = 'you@test.lindsaar.net'
#  mail.subject 'This is a test email'
#  mail.body    = 'This is a body'
# 
#  mail.to_s #=> "From: mikel@test.lindsaar.net\r\nTo: you@...
从那以后,在集成中测试邮件应该很容易
mail = ActionMailer::Base.deliveries.last
assert_equal 'mikel@test.lindsaar.net', mail['from'].to_s
assert_equal 'you@test.lindsaar.net', mail['to'].to_s
Veg*_*ger 27
在测试期间使用ActionMailer时,所有邮件都放在一个名为的大数组中deliveries.你基本上在做什么(并且主要是足够的)是检查数组中是否存在电子邮件.但是,如果您想要专门检查某个电子邮件,则必须知道数组中实际存储的内容.幸运的是,电子邮件本身已存储,因此您可以遍历数组并检查每封电子邮件.
请参阅ActionMailer :: Base以查看可用的配置方法,您可以使用这些方法确定阵列中存在的电子邮件.一些最适合你的情况的方法可能是
recipients:获取一个或多个电子邮件地址.这些地址是您的电子邮件将发送到的地方.设置To:标题.subject:您的电子邮件的主题.设置Subject:标题.Nea*_*eal 19
使用当前的Rspec语法,我最终使用以下内容:
last_email = ActionMailer::Base.deliveries.last
expect(last_email.to).to eq ['test@example.com']
expect(last_email.subject).to have_content 'Welcome'
我的测试环境是一个功能规范,我想确保在注册后向用户发送了欢迎电子邮件.
Fel*_*lix 13
从 2020 年开始(Rails 6 时代,可能之前介绍过),您可以执行以下操作:(使用 SystemTest 示例)TL;DR:使用assert_emailsfromActionMailer::TestHelper和ActionMailer::Base.deliveries.last来访问邮件本身。
require "application_system_test_case"
require 'test_helper'
require 'action_mailer/test_helper'
class ContactTest < ApplicationSystemTestCase
  include ActionMailer::TestHelper
  test "Send mail via contact form on landing page" do
    visit root_url
    fill_in "Message", with: 'message text'
    # Asserting a mail is sent
    assert_emails 1 do
      click_on "Send"
    end
    # Asserting stuff within that mail
    last_email  = ActionMailer::Base.deliveries.last
    assert_equal ['whatever'], last_email.reply_to
    assert_equal "contact", last_email.subject
    assert_match /Mail from someone/, last_email.body.to_s
  end
end
官方文档:
注意 您也可以测试是否使用了特定的邮件程序操作,而不是像上面的系统测试那样手动检查邮件的内容,如下所示:
assert_enqueued_email_with ContactMailer, :welcome, args: ["Hello", "Goodbye"]
还有其他一些方便的断言,请参阅https://api.rubyonrails.org/v6.0.3.2/classes/ActionMailer/TestHelper.html#method-i-assert_emails。
| 归档时间: | 
 | 
| 查看次数: | 35194 次 | 
| 最近记录: |