样品工厂
FactoryBot.define do
factory :fruit do
name { "Kiwi" }
status { "available" }
store { Store.first }
end
trait :unaccessible do
status { "unaccessible" }
store { status: "closed", hours_before_open: 2 }
end
end
在trait块中,我一直在努力寻找一种方法来更新关联Store对象的属性。在documentation的Traits部分没有找到示例。也没有找到任何例子在这里搜索SO和谷歌搜索。这甚至可能吗?
3条答案
按热度按时间8cdiaqws1#
我相信你也应该能够覆盖trait中的关联,就像这样:
那么你就不需要执行额外的数据库写入来更新after create中的store对象。
ax6ht2ek2#
使用
after
块覆盖这些属性。bogh5gae3#
我更喜欢海伦的回答!它很简单,避免了对数据库的额外写入。还建议将trait定义移到工厂定义中。否则,它就是一个全局trait,可能会与其他同名的全局trait冲突。
为了好玩,这里有一个使用
transient
的替代方案。它定义了一些属性,你可以用这些属性来参数化工厂中的东西,这些属性不会在生成的对象上设置。然后,您可以在规范中使用
store_attrs
来微调存储,而无需定义更多trait:虽然在这个例子中,你可以只在一个单独的
let
中定义商店: