2012-03-06 9 views
2

FactoryGirlを使用して、1回限りの工場を作成したいと考えています。つまり、工場は範囲外になるとすぐには存在しません。FactoryGirlで "one-off"ファクトリを構築できますか?

ほとんどの工場がのようなもので定義されています。

Factory.define(:user) do 
    first_name "James" 
    last_name "Smith" 
end 

u = Factory.build(:user) 

しかし、それをやってこの方法がfactorygirlは永遠:user工場への参照を保持していることを意味します。あなたがどこにいるかにかかわらず、Factory.build(:user)は前に定義したものを意味します。私がしたいことは、このようなものです:

f = Factory.temporary(:user) do 
    first_name "David" 
    last_name "Jones" 
end 

u = f.build 

とすぐfとしてスコープから外れ、あなたはもうそれを参照することはできませんが、そうではないです工場とあなたのオブジェクト空間を汚染の危険は存在しません中古。 (特定のテストでのみ使用されている一度限りの工場が必要な場合は、テストの残りの部分にさらされることは望ましくありません)。

これは可能ですか?そうでなければ、それと同等のことをさせる宝石はありますか?

+0

理由だけではなく、あなたがしたい属性を持つユーザーファクトリをオーバーライドしていませんか? 'Factory.build:user、:first_name => 'David'、:last_name => 'Jones'' – James

+0

@Jamesこれは、私が何かできるようになる前にすべての工場をロードする必要があるため、それらの工場のほぼすべてが所定のテスト。それは悪い孤立であり、それはちょっとしたテストです。 「最初からリンゴパイを作りたいなら、最初に宇宙を作る必要があります」とカール・セイガンの素晴らしい見解ですが、単体テストの作成には当てはまりません。 –

+1

特定のテストのための一回限りのファクトリが必要な場合、私の推測では、工場は正しいパターンではなく、let(:user){User.new(:first_name => 'David'、:last_name => 'TooSoon')} 'または単にmocks + stubs。 –

答えて

0

これはハックですが、:

module FactoryGirl 
    class Registry 
    def remove(name) 
     @items[name.to_sym] = nil 
    end 
    end 
end 

before do 
    Factory(:my_user, :parent => :user) do |f| 
    f.first_name "David" 
    end 
end 

after do 
    FactoryGirl.factories.remove(:my_user) 
end 
関連する問題