我正在編寫我的第一個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文件,但我確定這是這是一個新手問題,它不會被要求!
由於提前,
斯圖
'cart.line_items(ruby_book)'是不正確的。我想你可能需要'cart.line_items.find_all_by_product_id(ruby_book.id)'。這不是針對解決你的問題。此外,它看起來像你可以分解你的一個測試到2或3個單獨的測試。 –
感謝@Wizard of Ogz 你是對的,那裏有太多的斷言。我確信cart.line_items(ruby_book)會生成與替代方案相同的SQL ...但我也會檢查它。 – Stu
我檢查了你的建議,並且它是Ogz的@Wizard點 - 非常感謝。 對於以下這個人,我行生成的SQL沒有限制到的product_id都: SELECT 「line_items」 * FROM 「line_items」 WHERE( 「line_items」 .cart_id = 980190962) 的唯一原因,工作,它沒有其他用戶也有一個購物車! – Stu