FactoryBot Rails问题:工厂定义外调用其他工厂失败求助
嘿,我来帮你解决这个FactoryBot的复用问题!你想要在:charge_transaction工厂里,让origem_account_id和transactional_code两个字段共用同一个:legal_person_account实例的属性,对吧?之前的错误大概率是因为你可能不小心创建了两个独立的账户实例,或者写法不符合FactoryBot的语法导致的。
这里有两种靠谱的实现方式,根据你的测试场景选就行:
方式一:用临时属性(Transient Attributes)复用已创建的账户
这种方式适合你需要持久化(create)legal_person_account的场景,它会先创建一个单一的账户实例,然后把它的ID和交易码分别赋值给目标字段:
FactoryBot.define do factory :charge_transaction do # 先定义交易的其他必填字段 amount { 150.75 } status { :completed } # 用transient定义临时属性,不会被写入charge_transaction模型 transient do # 创建一个唯一的legal_person_account实例 origin_account { create(:legal_person_account) } end # 复用同一个账户的属性 origem_account_id { origin_account.id } transactional_code { origin_account.transactional_code } end end
方式二:在构建回调里复用未持久化的账户
如果你只是想构建(build)交易而不需要立刻保存账户,可以用after(:build)回调来处理,这样更灵活:
FactoryBot.define do factory :charge_transaction do amount { 150.75 } status { :pending } transient do # 这里用build而不是create,得到未保存的账户实例 origin_account { build(:legal_person_account) } end after(:build) do |transaction, evaluator| # 把临时账户的属性赋值给交易字段 transaction.origem_account_id = evaluator.origin_account.id transaction.transactional_code = evaluator.origin_account.transactional_code # 如果后续需要保存账户,取消下面的注释即可 # evaluator.origin_account.save! end end end
额外提示
如果你的:legal_person_account需要特定的属性(比如指定账户类型、余额等),直接在临时属性里传入参数就行:
transient do origin_account { create(:legal_person_account, account_type: 'current', balance: 5000.0) } end
这样写的好处是保证了两个字段关联的是同一个账户实例,同时完全符合FactoryBot的语法规则,不会再出现“识别不了外部工厂”的错误啦!
内容的提问来源于stack exchange,提问作者Kelvin Matheus
相关产品推荐
相关产品推荐

