访问 *other* 工厂中的 factory_girl 工厂
Posted
技术标签:
【中文标题】访问 *other* 工厂中的 factory_girl 工厂【英文标题】:Accessing factory_girl factories in *other* factories 【发布时间】:2011-01-15 01:48:50 【问题描述】:我在我的rails 应用程序中使用factory_girl 插件。对于每个模型,我都有一个包含工厂数据的相应 ruby 文件,例如
Factory.define :valid_thing, :class => Thing do |t|
t.name 'Some valid thing'
# t.user ???
end
我有很多不同类型的用户(已经在用户工厂中定义)。如果我尝试以下方法:
Factory.define :valid_thing, :class => Thing do |t|
t.name 'Some valid thing'
t.user Factory(:valid_user) # Fails
end
我收到以下错误:
# No such factory: valid_user (ArgumentError)
:valid_user 实际上是有效的——我可以在我的测试中使用它——只是不能在我的工厂中使用。有什么办法可以在这里使用另一个文件中定义的工厂吗?
【问题讨论】:
【参考方案1】:从问题的年龄来看,可能是 Factory Girl 的新功能,但如果您在工厂中的属性名称与工厂名称相同,则只需调用工厂中的属性名称即可填充它与相关的工厂代。
FactoryGirl.define do
factory :thing do
user
end
end
这应该会导致用户字段查找具有相同名称的工厂并从中填充它。
【讨论】:
【参考方案2】:你应该使用这个代码:
Factory.define :valid_thing, :class => Thing do |t|
t.name 'Some valid thing'
t.user Factory(:valid_user)
end
将调用包装在 中会导致 Factory Girl 在创建 :valid_thing 工厂之前不会评估大括号内的代码。这将迫使它等到 :valid_user 工厂已加载(您的示例失败,因为它尚未加载),它还将导致为每个 :valid_thing 创建一个新的 :valid_user 而不是为所有用户创建相同的用户:valid_thing's (这可能是你想要的)。
【讨论】:
这很好用。只要知道Factory(:valid_user)
语法已被弃用;请改用FactoryGirl.create(:valid_user)
。
当我尝试构建时使用create(:valid_user)
(:valid_thing)实际上会进行创建,对吗?有没有办法让这个引用泛型根据被调用来创建/构建?
@mpgarate - 不,构建不会
Factory(:valid_user)
语法在这一点上不仅被弃用;它现在完全消失了,没有弃用消息。您可以简单地使用create(:valid_user)
,而不使用FactoryGirl
。【参考方案3】:
尝试使用关联方法,例如:
Factory.define :valid_thing, :class => Thing do |t|
t.name 'Some valid thing'
t.association :valid_user
end
【讨论】:
你也可以t.association :user, factory: :valid_user
以上是关于访问 *other* 工厂中的 factory_girl 工厂的主要内容,如果未能解决你的问题,请参考以下文章
设计模式在实际业务应用中的介绍之1——抽象工厂模式实现对数据库访问组件的封装
Vulnerabilities in other authentication mechanisms其他身份验证机制中的漏洞