2011-07-05 55 views
0

我正在編寫我的第一個Rails'Store'應用程序,並且在我的一個測試中遇到了一些奇怪的事情。我想測試add_product方法上cart.rb:在Rails中更新ActiveRecord測試

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)'。這不是針對解決你的問題。此外,它看起來像你可以分解你的一個測試到2或3個單獨的測試。 –

+0

感謝@Wizard of Ogz 你是對的,那裏有太多的斷言。我確信cart.line_items(ruby_book)會生成與替代方案相同的SQL ...但我也會檢查它。 – Stu

+0

我檢查了你的建議,並且它是Ogz的@Wizard點 - 非常感謝。 對於以下這個人,我行生成的SQL沒有限制到的product_id都: SELECT 「line_items」 * FROM 「line_items」 WHERE( 「line_items」 .cart_id = 980190962) 的唯一原因,工作,它沒有其他用戶也有一個購物車! – Stu

回答

1

要修改的訂單項的數量屬性,但不保存更改。 調用父級保存不會保存子級的屬性。 您可以在增量行之後的add_product方法中調用save current_item。

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

嗨@simianarmy 謝謝 - 工作。 雖然解決方案讓我感到困擾。看起來奇怪的是,我現在必須在第一次添加產品時明確地調用.save,但我不必在添加現有產品時調用它,因爲它在add_product的「else」子句中調用方法。 有沒有更好的方法來做到這一點?我現在可能總是知道產品是否已經存在或不存在... 乾杯,Stu – Stu

+0

啊 - 我剛剛讀了你的答案。這是我打電話保存的** line_items **集合。 再次歡呼 – Stu

相關問題