2016-03-24 7 views
1

私はテスト用のモデルオブジェクトを作成するためにファクトリーガールを使用しています。私はオーバーライドが与えられても、モデルの属性を操作しようとしています。工場の女の子:そのフィールドをオーバーライドしてもモデルのフィールドを操作します

例:次のように私のテストでは

factory :user, :class => User do 
     domain_id 1 
     email { F.generate(:email) } 
     updated_at { <do some manipulation> } 
    end 

、私はそれを使用しています:

user = F.create(:user, :updated_at => Time.now.utc) 

これは私が工場の定義を持っているupdated_atの上で操作をスキップします。オーバーライドが提供されても操作を強制する方法はありますか?

答えて

0

F.create(:user, updated_at: overridden_value)を呼び出すときに、あなたがオーバーライドされた値を渡します、呼び出し側から渡された場合Factorygirl callbacks:

factory :user, :class => User do 
    domain_id 1 
    email { F.generate(:email) } 
    updated_at { <do some manipulation> } 

    after(:create) do |user| 
    #user.updated_at <do some manipulation> 
    end 

    after(:build) do |user| 
    <do some manipulation> 
    end 

エンド

+0

ありがとう!それは多くを助ける –

0

オーバーライド値が良いだろう、すなわちを試してみてください。

他の回答で示唆されているものとは異なるアプローチです。工場の女の子はtraitsです。これは工場で特定の目的に使用できます。あなたは次のようにupdated_atのための操作を行う特性を定義することができます。

factory :user, :class => User do 
    domain_id 1 
    email { F.generate(:email) } 

    trait :manipulated_updated_at do 
     # Manipulation code 
    end 
end 

次に、あなたのようにそれを呼びたい:

user = F.create(:user, :manipulated_updated_at, :updated_at => Time.now.utc) 
+0

両方の素晴らしい答え!ありがとう! –

関連する問題