私は最初の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ファイルを追加できますが、それは必須ではない、そんな初心者の質問です!事前に
おかげで、
ステュー
'cart.line_items(ruby_book)'が正しくありません。 'cart.line_items.find_all_by_product_id(ruby_book.id)'がほしいと思う。それはあなたの問題を解決することに向けられていません。また、1つのテストを2つまたは3つの別々のテストに分けることができるようです。 –
オグズのおかげで@Wizard あなたはそこにあまりにも多くのアサーションがあります。私はcart.line_items(ruby_book)が別のものと同じSQLを生成すると確信しています...私はそれもチェックします。 – Stu
私はあなたの提案をチェックし、それはOgzの@Wizardのスポットライトです。この次、誰のために は、私のラインのために生成されたSQLは、すべてのproduct_idに制限するものではありませんでした:。 SELECT「line_items」*「line_items」(「line_items」.cart_id = 980190962) 唯一の理由は、そこからカートを持っている他のユーザーがいなかったということもありました! – Stu