在* 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 
+0

你也可以't.association:user,factory :: valid_user' – Kris 2016-10-31 16:40:44

您应使用此代码:

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的(这可能是你想要的)。

+10

这个效果很好。只要知道'Factory(:valid_user)'语法已被弃用;改用'FactoryGirl.create(:valid_user)'。 – 2013-05-10 02:31:01

+0

当我尝试构建(:valid_thing)时,使用'create(:valid_user)'实际上会进行创建,对吗?有没有办法让这个引用泛型创建/建立取决于哪个被称为? – mpgarate 2014-06-22 12:27:38

+0

@mpgarate - 不,编译不会 – 2014-11-26 15:53:26

根据问题的年龄来判断Factory Factory的一个新功能,但如果Factory中属性的名称与工厂名称相同,只需在工厂中调用该属性的名称即可用相关的Factory代码填充它。

FactoryGirl.define do 
    factory :thing do 
    user 
    end 
end 

这应该会导致用户字段寻找具有相同名称的工厂并从中填充该工厂。

+0

这对我有用 – 2017-04-26 04:42:58