2012-02-01 13 views
1

暗黙のhas_manyアソシエーションを持つモデルをテストしようとしていますが、いくつかの問題があります。暗黙のhas_manyアソシエーションを持つ工場少女

私はデータベースにテーブルBがないか、またはオブジェクトBに関連付けられているアクティブなレコードクラスを除き、Bが基本的に外部キーであるB_ID列を持つテーブルAを持っています。入札。我々は、テーブルCのためのモデルで

# implicit has_many :alphas 
def alphas 
    Alpha.where(:b_id => b_id).order(:xyz) 
end 

このデータベース構造は、私が持っているデータのために理にかなっていると、非テストコードは正常に動作します。

私のテストコードはほとんど動作しています。私は単純なものが欠けていると思います。

IはAとCのために定義された工場があり、そしてIは、試験有する:

a1 = Factory(:alpha, :b_id => 123, :xyz => 100) 
a2 = Factory(:alpha, :b_id => 123, :xyz => 200) 
c1 = Factory(:c, :b_id => 123) 

puts c1.alphas.count 
puts c1.alphas.first 

c1.alphas.first.should == a1 

出力である:

2 
nil 
<test fails> 

にB_ID結果を共有するオブジェクトの数を変更しますc1.alphas.countは変更されていますが、暗黙的な関連付けの中で実際にAオブジェクトを取得できないようです。代わりに常にnilを取得します。私のCモデルでは、個々のAオブジェクトのフィールドにアクセスする必要があるため、テストできないメソッドがあります。

誰かがここで何が起こっているのか、またこれを回避するために何ができるかについての洞察はありますか?ありがとう。

+0

あなたは 'c1.alphas.class.name'を置くならば、あなたは何を得るのですか? –

+0

@BenLee、ActiveRecord :: Relation – jtabak

+0

ちょうど好奇心から、 'puts c1.alphas.to_a [0]'はレコードを表示しますか? '' puts c1.alphas.limit(1).to_a [0] 'はどうでしょうか?私は、破損が何らかの形で失敗したバックグラウンドの自動ロードにあるかどうか不思議です。 –

答えて

1

この例では、Admin_userにAdminの役割を持たせています。この場合の役割に

https://github.com/drhenner/ror_ecommerce/blob/master/spec/factories/user.rb

工場ではありません。

私は次のようにこれを行うのが最適です。

@order = Factory(:order) 
    order_item = Factory(:order_item, :total => 5.52) 
    @order.stubs(:order_items).returns([order_item, order_item]) 

または

@order = Factory(:order) 
    order_item = Factory(:order_item, :total => 5.52, :order => @order) 
+0

アソシエーションをスタブすることは、私が心に留めていたクリーンな解決策ではありませんが、それは完了しました – jtabak

+0

私は答えを削除しますか?スタックオーバーフローが私に尋ねました。はい、上記のリンクで私自身のコードを参照したという免責事項が必要です。申し訳ありません私は前にそれを言わなかった場合。 – drhenner

関連する問題