Rails 5.2引擎中Factory Bot工厂初始化失败,如何运行系统测试?
解决Rails 5.2引擎系统测试中FactoryBot工厂无法加载的问题
我之前开发Rails引擎时也碰到过一模一样的问题,给你两个亲测有效的解决方案,你可以根据自己的需求选择:
方案一:让Dummy App加载引擎的工厂文件
这是最直接的做法,因为rails test:app:system本来就是在Dummy App的上下文里跑测试,我们只需要让Dummy App知道引擎的工厂文件在哪里就行。
- 打开Dummy App的测试辅助文件
test/dummy/test/test_helper.rb - 在文件末尾添加以下代码:
# 指向引擎的factories目录 FactoryBot.definition_file_paths << File.expand_path('../../../../test/factories', __FILE__) # 重新加载FactoryBot的定义 FactoryBot.reload
这样Dummy App启动测试时,就会同时加载引擎里的所有工厂文件,再也不会出现“Factory xxx not initialized”的错误了。
方案二:让系统测试直接在引擎上下文运行
如果你不想依赖Dummy App的环境,也可以调整测试配置,让系统测试直接在引擎的上下文里执行:
- 在引擎的
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
- 确保引擎的
test/test_helper.rb里已经正确配置了FactoryBot:
require 'factory_bot_rails' class ActiveSupport::TestCase include FactoryBot::Syntax::Methods end
- 运行测试时,直接执行引擎目录下的命令:
bundle exec rails test test/system/ --root=.
这个方案会让测试直接在引擎的环境中运行,不需要Dummy App去加载额外的工厂文件。
两种方案都能解决问题,我个人更推荐方案一,因为它更贴合Rails引擎测试的默认流程,配置起来也更简单。
内容的提问来源于stack exchange,提问作者Grey
相关产品推荐
相关产品推荐

