在* other *工厂访问factory_girl工厂
我在我的rails应用程序中使用了factory_girl插件。对于每个模型,我都有一个相应的ruby文件,其中包含工厂数据,例如在* other *工厂访问factory_girl工厂
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实际上是有效的,但 - 我可以在我的测试中使用它 - 只是没有在我的工厂。有什么办法可以在这里使用另一个文件中定义的工厂?
尝试使用关联方法,如:
Factory.define :valid_thing, :class => Thing do |t|
t.name 'Some valid thing'
t.association :valid_user
end
您应使用此代码:
Factory.define :valid_thing, :class => Thing do |t|
t.name 'Some valid thing'
t.user { Factory(:valid_user) }
end
结束语在{}的调用导致工厂女孩不评估括号内的代码,直到:valid_thing工厂被创建。这将迫使它等待valid_user工厂被加载(你的例子失败,因为它尚未加载),它也会导致为每个:valid_thing创建一个新的:valid_user,而不是所有的用户都是相同的:valid_thing的(这可能是你想要的)。
这个效果很好。只要知道'Factory(:valid_user)'语法已被弃用;改用'FactoryGirl.create(:valid_user)'。 – 2013-05-10 02:31:01
当我尝试构建(:valid_thing)时,使用'create(:valid_user)'实际上会进行创建,对吗?有没有办法让这个引用泛型创建/建立取决于哪个被称为? – mpgarate 2014-06-22 12:27:38
@mpgarate - 不,编译不会 – 2014-11-26 15:53:26
根据问题的年龄来判断Factory Factory的一个新功能,但如果Factory中属性的名称与工厂名称相同,只需在工厂中调用该属性的名称即可用相关的Factory代码填充它。
FactoryGirl.define do
factory :thing do
user
end
end
这应该会导致用户字段寻找具有相同名称的工厂并从中填充该工厂。
这对我有用 – 2017-04-26 04:42:58
你也可以't.association:user,factory :: valid_user' – Kris 2016-10-31 16:40:44