You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 5.2引擎中Factory Bot工厂初始化失败,如何运行系统测试?

解决Rails 5.2引擎系统测试中FactoryBot工厂无法加载的问题

我之前开发Rails引擎时也碰到过一模一样的问题,给你两个亲测有效的解决方案,你可以根据自己的需求选择:

方案一:让Dummy App加载引擎的工厂文件

这是最直接的做法,因为rails test:app:system本来就是在Dummy App的上下文里跑测试,我们只需要让Dummy App知道引擎的工厂文件在哪里就行。

  1. 打开Dummy App的测试辅助文件 test/dummy/test/test_helper.rb
  2. 在文件末尾添加以下代码:
# 指向引擎的factories目录
FactoryBot.definition_file_paths << File.expand_path('../../../../test/factories', __FILE__)
# 重新加载FactoryBot的定义
FactoryBot.reload

这样Dummy App启动测试时,就会同时加载引擎里的所有工厂文件,再也不会出现“Factory xxx not initialized”的错误了。

方案二:让系统测试直接在引擎上下文运行

如果你不想依赖Dummy App的环境,也可以调整测试配置,让系统测试直接在引擎的上下文里执行:

  1. 在引擎的test目录下创建system/test_helper.rb文件,内容如下:
require File.expand_path('../test_helper', __dir__)
require 'capybara/rails'
require 'capybara/minitest'

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  # 这里可以根据你的需求选择驱动,比如selenium或者headless_chrome
  driven_by :selenium, using: :chrome, screen_size: [1400, 1400]
  
  # 引入FactoryBot的语法方法
  include FactoryBot::Syntax::Methods
end
  1. 确保引擎的test/test_helper.rb里已经正确配置了FactoryBot:
require 'factory_bot_rails'

class ActiveSupport::TestCase
  include FactoryBot::Syntax::Methods
end
  1. 运行测试时,直接执行引擎目录下的命令:
bundle exec rails test test/system/ --root=.

这个方案会让测试直接在引擎的环境中运行,不需要Dummy App去加载额外的工厂文件。

两种方案都能解决问题,我个人更推荐方案一,因为它更贴合Rails引擎测试的默认流程,配置起来也更简单。

内容的提问来源于stack exchange,提问作者Grey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 04:52:39