2012-08-10 94 views
0

我试图与我的工厂使用工厂女孩创建关联的方式,以便相关联的对象共享正确的数据以将它们匹配在一起。Rails工厂女孩协会

我遇到了对象A与对象C的一个实例相关的场景,而对象B与对象C的另一个实例有关,当我希望它们都与对象的相同实例相关时C.

工厂女孩 - https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md 使用最新版本

这里是什么,我想在我的项目做一个简单的例子。

FactoryGirl.define do 
     factory :neutral_position, class: FinancialAccounting::Update::Neutral::Position do 
      created_at { Time.now } 
      updated_at { Time.now } 

      factory :valid_neutral_position do 
      association :security, factory: :security 

      factory :valid_neutral_position_with_production_record do 
       association :position, factory: :position 

       # This modifies the created production account record so the attributes match. 
       FactoryGirl.modify do 
       factory :position, class: FinancialAccounting::Position do 
        association :security, factory: :security 
       end 
       end 
      end 
      end 

     end 
     end 

注意我试图修改关联的位置,以便它指向在:valid_neutral_position工厂中生成的相同安全性。此代码目前创建两个独立证券,因此中立头寸与一个证券关联,而头寸工厂与不同证券关联。

我该如何做到这一点?我在整个应用程序中都看到了这个问题,所以想清楚这一点会大大改善我的应用程序测试套件并使我的代码保持干爽。

回答

1

实际上,在您的测试/规格而非工厂定义中进行分类更容易。

首先创建一个安全并将其分配给一个变量。

然后,当创建一个对象时,您要依赖该安全性将该变量传递给工厂构造函数。

虽然你的例子是有点复杂的,可能是这样的:

specific_security = FactoryGirl.create(:security) 
valid_natural_position = FactoryGirl.create(:valid_natural_position, security: specific_security) 
position = FactoryGirl.create(:position, security: specific_security) 

这样可以确保该对象是否建立在你的测试,你需要它们的方式。由于两个辅助工厂不再自动创建安全对象,因此它具有减少创建的对象数量的额外好处。

+0

这就是我们也在做的事情,但为什么工厂协会呢? – 2014-10-01 08:25:56

1

我其实用了一种不同的方法。它包含在工厂中,从而导致更清洁的测试。但是,当你不一定需要时,我确实发现必须生成更多对象的缺点。

FactoryGirl.define do 
    factory :neutral_position, class: FinancialAccounting::Update::Neutral::Position do 
    created_at { Time.now } 
    updated_at { Time.now } 

    factory :valid_neutral_position do 
     has_production_position 
    end 

    trait :has_production_position do 
     association :position, factory: :position 
     security { position.security } 
    end 

    end 
end