私は本AgileWebDevelopment with Rails(4th edition)をフォローしていますが、テストケースの失敗で問題が発生しています。
カートに重複アイテムを追加しても、アイテムの数は変わらないが、数量は変わることを確認するテストを作成しました
test 'adding duplicate products to cart' do
cart = Cart.new
ruby_book = products(:ruby)
cart.add_product ruby_book.id
assert cart.line_items.length == 1
assert cart.total_price == ruby_book.price
p '-------start--------'
p 'outside add_product'
p "line_items: #{cart.line_items}"
cart.add_product ruby_book.id
assert cart.line_items.length == 1 # TEST FAILS HERE with length == 2
assert cart.total_price == ruby_book.price * 2
end
基本的にadd_product
メソッドをテストします。これは次のとおりです。
class Cart < ActiveRecord::Base
has_many :line_items, dependent: :destroy
def add_product(product_id)
p 'inside add_product'
p "line_items: #{line_items}"
p "product_id: #{product_id}"
current_item = line_items.find_by_product_id(product_id)
p "current_item: #{current_item}"
p '---------end---------'
if current_item
current_item.quantity += 1
current_item.price += current_item.product.price
else
current_item = line_items.build(product_id: product_id)
current_item.price = current_item.product.price
end
current_item
end
def total_price
line_items.to_a.sum { |item| item.price }
end
end
テストをデバッグするために、いくつかの印刷呼び出しを追加しました(ご覧のとおり)。出力は次のとおりです。
"-------start--------"
"outside add_product"
"line_items: [#<LineItem id: nil, product_id: 207281424, cart_id: nil, created_at: nil, updated_at: nil, quantity: 1, price: #<BigDecimal:7fa491744fe0,'0.4999E2',18(45)>>]"
"inside add_product"
"line_items: [#<LineItem id: nil, product_id: 207281424, cart_id: nil, created_at: nil, updated_at: nil, quantity: 1, price: #<BigDecimal:7fa491744fe0,'0.4999E2',18(45)>>]"
"product_id: 207281424"
"current_item: "
"---------end---------"
line_items
アイテムがあることがわかりますproduct_id: 207281424
が、何らかの理由で呼び出しline_items.find_by_product_id(product_id)
はアイテムを返しませんが、を返しますnil
。なんで?