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

使用FactoryBot运行Rails测试报uninitialized constant错误如何解决?

问题根因

factory_bot默认会将工厂名映射为同名的ActiveRecord类,出现uninitialized constant Stock报错的核心原因是factory_bot在初始化stock工厂实例时,无法找到对应的Stock类定义。

排查思路
  • 确认项目中是否存在Stock类,默认Rails模型应放在app/models/stock.rb路径下
  • 若Stock类存在,检查是否带有命名空间(如CoreDomain::Stock),factory_bot默认无法自动识别带命名空间的模型
  • 检查Stock类所在目录是否已添加到Rails自动加载路径中,自定义模型存储路径需要手动配置自动加载规则
  • 确认测试执行前工厂文件已正确加载,你代码中已手动require工厂文件,可排除此问题
解决方案

分不同场景处理:

场景1:无对应的Stock模型,仅需工厂生成模拟数据

在工厂定义中显式指定不需要映射ActiveRecord,直接用OpenStruct承载属性即可:

FactoryBot.define do
  factory :stock, class: OpenStruct do
    ticker { Faker::Finance.ticker }
    name { Faker::Company.name }
    sector { Faker::Company.industry }
    cusip { nil }
    isin { nil }
    sedol { nil }
    price { Faker::Commerce.price(range: 0..10_000) }
  end
end

如果有自定义的非ActiveRecord的Stock类,将class参数指定为对应类的完整名称即可。

场景2:Stock模型存在但带有命名空间

在工厂定义中显式指定模型的完整类名:

# 例如Stock类定义为CoreDomain::Stock时
factory :stock, class: 'CoreDomain::Stock' do
  # 原有属性保持不变
end

场景3:Stock模型存在但不在默认自动加载路径

在config/application.rb中添加对应目录到自动加载配置:

config.autoload_paths << Rails.root.join('app', 'models', 'your_custom_dir')

修改后重启测试服务再执行测试即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:36:04