FactoryBot创建tracker与多态trackable共享同一用户的实现问题
问题原因
- 现有工厂代码存在语法错误:FactoryBot 定义特征使用单数关键字
trait,使用复数traits会导致特征不生效 - 原有
after(:build)回调属于后置赋值,在关联对象(Dog/Cat/Horse)的user为必填时,创建trackable对象阶段就会因缺少user触发验证失败;如果Tracker存在user与trackable.user一致性的校验,也会在回调执行前就报错 - 直接用
association :trackable, factory: :dog的写法会自动为trackable生成独立的新user,不仅和tracker的user不一致,还会产生多余的测试数据
解决方案
直接修改trait定义,在创建trackable关联时主动传入当前tracker的user,不需要额外回调:
factory :tracker do user trait :dog do trackable { association :dog, user: user } end trait :cat do trackable { association :cat, user: user } end trait :horse do trackable { association :horse, user: user } end end
效果验证
可直接按原有方式调用工厂,生成的tracker和对应trackable会自动绑定同一个用户:
# 不传自定义user时,自动生成同一个用户绑定两个对象 tracker = create(:tracker, :dog) tracker.user == tracker.trackable.user # => true # 也支持传入自定义用户 my_user = create(:user) tracker = create(:tracker, :dog, user: my_user) tracker.user == my_user # => true tracker.trackable.user == my_user # => true
内容的提问来源于stack exchange,提问作者sscirrus
相关产品推荐
相关产品推荐

