2017-05-24 2 views
0

FactoryGirlでデータを初期化しようとすると、作成した以前のデータにアクセスできないという問題が発生しています。FactoryGirlがDB内でインスタンスを見つけられない

私は、Product、CartItem、およびOrde​​rItemという3つの異なるモデルがあります。これは基本的なルールです。

  • CartItemとOrderItem belongs_to Productが必要です。
  • 製品に固有の識別子 'name'があります。

私の工場のファイルが同じように設定されているので:

製品

FactoryGirl.define do 
    factory :product do 
    name "A Product" 
    end 
end 

CartItem

FactoryGirl.define do 
    factory :cart_item do 
    association :product do 
     Product.find_by(name: "A Product") || FactoryGirl.create(:product) 
    end 
    end 
end 

のOrderItem

FactoryGirl.define do 
    factory :order_item do 
    association :product do 
     Product.find_by(name: "A Product") || FactoryGirl.create(:product) 
    end 
    end 
end 

今、一つの試験中に、私が最初にFactoryGirl.create(:cart_item)

このコールを使用してCartItemを作成するすべてが正常に実行されます。 Productがないので、新しい商品を作成してからCartItemに割り当てます。

次に、私はそれが名前」を使用して新しい製品を作成しようとするとこれは失敗し、エラーValidation failed, Name has already been taken

で失敗し、この呼び出しFactoryGirl.create(:order_item)

私はそれを実行する。この時間を利用してのOrderItemを作成しようCartItemを作成するための呼び出しからすでに作成された「A Product」を選択します。

しかし、これは、Product.find_by("A Product") || FactoryGirl.create(:product)を使用してOrderItemの製品を設定するので、新しいProductインスタンスを作成しようとすることはありません。

これはなぜ発生しているのですか?

+0

アイブ氏はまた、この 'ない限りProduct.find_by(名称: "製品")をやってみました(:製品)end'と同じ問題が発生FactoryGirl.createはありません –

答えて

0

は、私はあなたの問題は、あなたがassociationを使用している方法であると信じてい

を更新しました。私は、あなたがそれを定義しているように、関連がブロックを取るところはどこにも見ません。あなたの代わりに何をしたいのか

あなたは非決定論を作成しているので、これは実際には間違っているようだ。この

factory :cart_item do 
    product { Product.find_by(name: "A Product") || association(:product) }  
end 

のようなものです。その代わりに、レコードを作成してテストでファクトリに直接割り当てる必要があります。

あなたのテストで続いて
FactoryGirl.define do 
    factory :cart_item do 
    association :product 
    end 
end 

FactoryGirl.define do 
    factory :order_item do 
    association :product 
    end 
end 

product = FactoryGirl.create(:product) 
cart_item = FactoryGirl.create(:cart_item, product: product) 
order_item = FactoryGirl.create(:order_item, product: product) 
+0

私の悪い、それはタイプミスでした。私のコードは実際に 'Product.find_by(name:" A Product ")'を実行しています。私は元の質問でそれを修正しました。しかしそこにある 'name'宣言ではまだ同じ問題が発生しています –

+0

実際、FactoryGirlの 'association'の構文はどこにありますか?私は 'association'がブロックを取るとは思っていません。または少なくともそれは文書化されていません。 –

+0

私は正直なところ、Rubyの一般的な仕組みに基づいて試してみました。 Deviseを使ってModelとUserを関連付ける方法が必要でしたが、 'FactoryGirl.create(:user)'を実行するだけでdeviseを利用するユーザを作成することはできません。その代わりに '@user_attr = FactoryGirl.attributes_for(:user)'とそれに続く 'User.create(@user_attr)'を実行する必要があります。アソシエーションコールは工場から来ていないので、私はそれを 'do'ステートメントに置き換え、その中に2つのコールを配置しました。できます。 –

0

これは単なるアイデアですが、FactoryGirl設定でFactoryGirl.lintをコメントアウトしてみてください。

+0

は 'LIN-T'ですか?私はそれがどこにあるのか知りません。 –

関連する問題