Rails FactoryBot无法识别子目录Vehicle模型的解决方法
FactoryBot 定位非根目录下命名空间模型的配置方法
报错核心原因
FactoryBot 默认会根据工厂名称,按照Rails的自动加载规则匹配对应模型常量:名为vehicle的工厂,会默认尝试关联根命名空间下的Vehicle常量,也就是对应路径app/models/vehicle.rb的模型文件。
当模型实际存放在app/models/write_models/vehicle.rb、对应真实常量为WriteModels::Vehicle时,默认的匹配逻辑无法定位到正确常量,就会抛出NameError: uninitialized constant Vehicle报错。
具体修复步骤
在工厂定义的声明语句中,通过class参数显式绑定该工厂对应的真实模型类,跳过默认匹配逻辑:
- 修改工厂声明行代码,从默认写法改为显式指定类的写法:
# 原默认写法(匹配失败) factory :vehicle do # 调整后的正确写法(显式绑定真实模型类) factory :vehicle, class: WriteModels::Vehicle do
调整后完整的工厂代码如下:
FactoryBot.define do factory :vehicle, class: WriteModels::Vehicle do vehicle_model fuel_type vehicle_body_style organization_department vehicle_transmition vehicle_category vehicle_booking_condition { association :vehicle_booking_condition, vehicle: instance } manager trait :without_booking_condition do vehicle_booking_condition { nil } end end end
原有测试用例的调用逻辑无需做任何修改,保持原写法即可正常运行:
let(:operator_role) { build(:role, name: 'operator') } let(:manager) { build(:user, role: operator_role) } let(:vehicle) { build(:vehicle, manager: manager) }
补充说明:通过
class参数指定类的写法,不会改变工厂的调用标识,不需要将测试代码里的build(:vehicle)替换为其他格式的工厂名,完全兼容原有测试逻辑。
内容的提问来源于stack exchange,提问作者L.Wini
相关产品推荐
相关产品推荐

