使用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
相关产品推荐
相关产品推荐

