📅  最后修改于: 2023-12-03 15:26:31.125000             🧑  作者: Mango
在 Ruby on Rails 中,ActionMailer Base 是发送邮件的基础类。但是在测试、开发和生产环境中,我们不总是想要实际发送电子邮件。幸运的是,Ruby on Rails 提供了 NullMail 类,该类不会实际发送电子邮件,而是仅记录日志和输出电子邮件内容。
在您的 Gemfile 中添加下面的代码:
group :test do
gem 'nullmailer'
end
然后,在控制台中运行 bundle install
以安装 nullmailer gem。
将 ActionMailer 的默认发送器设置为 NullMail:
# config/environments/test.rb
Rails.application.configure do
config.action_mailer.delivery_method = :null_mail
end
现在,当您的应用程序调用 ActionMailer 发送电子邮件时,它们将被记录到您的应用程序日志中,而不会实际发送电子邮件。这可以确保在测试、开发和生产环境中不会发送意外的电子邮件。
class ExampleMailer < ApplicationMailer
def welcome_email(user)
@user = user
@url = 'https://example.com/login'
mail(to: @user.email, subject: 'Welcome to My Awesome Site')
end
end
# config/environments/test.rb
Rails.application.configure do
config.action_mailer.delivery_method = :null_mail
end
在测试中,您可以检查日志中的电子邮件内容,以确保邮件发送正确:
def test_welcome_email
ExampleMailer.welcome_email(@user).deliver_now
assert_equal 1, ActionMailer::Base.deliveries.size
assert_equal [@user.email], ActionMailer::Base.deliveries.last.to
assert_equal 'Welcome to My Awesome Site', ActionMailer::Base.deliveries.last.subject
assert_match(/<h1>Welcome to My Awesome Site<\/h1>/, ActionMailer::Base.deliveries.last.body.encoded)
end
使用 NullMail 替代 ActionMailer Base,可以有效避免在测试、开发和生产环境中发送意外的电子邮件,同时确保您的程序在以后修改时更加稳健和灵活。