Rails 8邮件测试中路由URL方法未定义的合规解决咨询
符合Rails规范的邮件测试URL助手使用方法
方法一:通过邮件实例调用URL助手(推荐)
ActionMailer::TestCase生成的邮件实例会自动继承测试环境中config.action_mailer.default_url_options的配置,直接通过邮件实例调用URL助手即可避免主机缺失问题,这是最贴合Rails规范的方式:
class MyMailerTest < ActionMailer::TestCase test "test mailer action" do # 先生成邮件对象 mail = MyMailer.my_action(token) # 通过邮件实例调用URL助手做断言 assert_select mail.html_part.body, "a[href=?]", mail.my_action_url(token) end end
方法二:手动配置路由助手的default_url_options
如果一定要手动引入路由助手,需要在测试类中单独为路由助手设置default_url_options(路由助手的配置与ActionMailer的配置是独立的):
require "test_helper" class MyMailerTest < ActionMailer::TestCase include Rails.application.routes.url_helpers setup do # 为路由助手设置主机 default_url_options[:host] = "example.com" end test "test mailer action" do assert_select "a[href=?]", my_action_url(token) end end
方法三:结合邮件内容的断言逻辑
先获取生成的邮件对象,直接对邮件的HTML内容做断言,同时可以利用url_for传入完整路由参数:
class MyMailerTest < ActionMailer::TestCase test "test mailer action" do mail = MyMailer.my_action(token) # 验证邮件发送数量(可选) assert_emails 1 # 对邮件HTML部分做链接断言 mail.html_part.body do |body| assert_select body, "a[href=?]", url_for( controller: "my", action: "action", token: token, only_path: false ) end end end
核心说明
- 邮件实例会自动继承ActionMailer的主机配置,因此通过邮件实例调用URL助手是最省心的规范写法,无需额外配置。
- 直接引入路由助手时,由于路由助手的
default_url_options和ActionMailer的配置不共享,所以会出现主机缺失错误,必须单独设置。
内容的提问来源于stack exchange,提问作者RedBassett
相关产品推荐
相关产品推荐

