Rails7系统测试中如何正确设置邮件确认链接的端口?
问题根因
Rails中*_url路由辅助方法生成完整链接时,依赖config.action_mailer.default_url_options配置的域名和端口。你测试环境的该配置没有适配系统测试随机端口的特性,所以沿用了开发环境的3000端口配置。
解决方案
- 修改测试环境配置
打开config/environments/test.rb,添加/修改以下配置,动态获取Capybara测试服务器的随机端口:
Rails.application.configure do # 其他配置保持不变 config.action_mailer.default_url_options = { host: "localhost", port: -> { Capybara.current_session.server.port } } end
用Lambda表达式作为端口值,每次生成邮件链接时都会自动读取当前测试服务器的实际端口,无需硬编码。
检查Clearance初始化配置
打开config/initializers/clearance.rb,确认没有硬写死host/port配置,Clearance默认会继承ActionMailer的default_url_options配置,不需要额外设置。优化冗余的sleep代码
你代码里的sleep 1是为了等待Turbo异步表单提交完成,不需要硬写等待时间,调整代码顺序即可:
assert_emails 1 do click_on "Sign up" # 等待页面出现确认提示,确保后端逻辑执行完成 assert_selector "span", text: I18n.t("flashes.confirmation_pending"), wait: 5 end
调整后不需要额外sleep,assert_selector自带等待超时机制,最多等5秒,只要提示出现就会继续执行,比硬写sleep更稳定。
配置完成后,邮件里生成的confirm_email_url会自动带当前测试服务器的正确端口,不需要再用端口替换的hack方法。
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

