2011-07-05 20 views
0

私は最初のRails 'Store'アプリを書いています。私は私のテストで奇妙なことを知りました。私はcart.rbにadd_productメソッドをテストしようとしている:ActiveRecord in Railsテストを更新する

class Cart < ActiveRecord::Base 
    has_many :line_items, :dependent => :destroy 

    def add_product(product) 
    current_item = line_items.find_by_product_id(product.id) 
    if current_item 
     current_item.quantity += 1 
    else 
     current_item = line_items.build(:product_id => product.id, :price => product.price)  
    end 
    current_item 
    end 

    def total_price 
    line_items.to_a.sum { |item| item.total_price } 
    end 

end 

私はカートに同じ製品を追加すると、二回改行(LINE_ITEM)を追加するのではなく、量を増大させることをテストしています。ここにテストがあります:

test "line item quantity is increased when duplicate product is added" do 
    cart = carts(:one) 
    ruby_book = products(:ruby) 

    cart.add_product(ruby_book) 
    cart.save  
    assert_equal 1, cart.line_items(ruby_book).to_a.count 

    cart.add_product(ruby_book) 
    cart.save 
    assert_equal 1, cart.line_items(ruby_book).to_a.count 
    assert_equal 2, cart.line_items(ruby_book).first.quantity # fail! 
    end 

私は最後のアサートで失敗します。数量は1です。私は2を期待しています。私はtest.logファイルをチェックしましたが、sqlite3インスタンスに対してアップデートは実行されていません...必要に応じてログやFixturesファイルを追加できますが、それは必須ではない、そんな初心者の質問です!事前に

おかげで、

ステュー

+1

'cart.line_items(ruby_book)'が正しくありません。 'cart.line_items.find_all_by_product_id(ruby_book.id)'がほしいと思う。それはあなたの問題を解決することに向けられていません。また、1つのテストを2つまたは3つの別々のテストに分けることができるようです。 –

+0

オグズのおかげで@Wizard あなたはそこにあまりにも多くのアサーションがあります。私はcart.line_items(ruby_book)が別のものと同じSQLを生成すると確信しています...私はそれもチェックします。 – Stu

+0

私はあなたの提案をチェックし、それはOgzの@Wizardのスポットライトです。この次、誰のために は、私のラインのために生成されたSQLは、すべてのproduct_idに制限するものではありませんでした:。 SELECT「line_items」*「line_items」(「line_items」.cart_id = 980190962) 唯一の理由は、そこからカートを持っている他のユーザーがいなかったということもありました! – Stu

答えて

1

ラインアイテムの数量属性を変更しますが、変更を保存していません。 親にsaveを呼び出すと、子の属性は保存されません。 インクリメント行の後にadd_productメソッドでcurrent_itemのsaveを呼び出すことができます。

if current_item 
    current_item.quantity += 1 
    current_item.save 
else 
+0

こんにちは@simianarmy ありがとうございます。 解決策は私を悩ませています。最初に製品を追加するときに私のテストで明示的に.saveを呼び出さなければならないのは奇妙に思えますが、add_productの 'else'節で呼び出されているので、既存の製品を追加するときに呼び出す必要はありません方法。 これを行うにはより良い方法がありますか?私は今、製品がすでにそこにあるかどうかを常に知っている可能性があります... 乾杯、Stu – Stu

+0

ああ - 私はもう一度あなたの答えを読んでいます。 ** line_items **コレクションで、私はsave onと呼んでいます。 もう一度乾杯 – Stu

関連する問題