为什么我的单元测试失败了?

时间:2011-05-13 00:38:47

标签: ruby-on-rails ruby-on-rails-3

你好,我的单元测试通过时遇到了一些问题。具体来说, * cart_test.rb * 中的那些失败了。

  test "add two different items" do
    cart = Cart.create
    book_one = products(:one)
    book_two = products(:two)
    cart.add_product(book_one.id).save!
    cart.add_product(book_two.id).save!
    assert_equal 2, cart.line_items.size
    assert_equal book_one.price + book_two.price, cart.total_price
  end

  test "add two unique items" do
    cart = Cart.create
    ruby_book = products(:ruby)
    cart.add_product(ruby_book.id).save!
    cart.add_product(ruby_book.id).save!
    assert_equal 2*ruby_book.price, cart.total_price
    assert_equal 1, cart.line_items.size
    assert_equal 2, cart.line_items[0].quantity
  end

这是我的存储库:https://github.com/zackster/Agile-Web-Development-w--Rails----DEPOT-application

有人可以帮我理解发生了什么吗?我相信测试失败了,因为这些项目实际上并没有被添加到购物车中,但它可能完全是另一回事[我是铁路新手]。 。 。谢谢!

1 个答案:

答案 0 :(得分:2)

CartTest测试失败,因为在Cart :: add_product中,您实际上并没有将新的line_item绑定到购物车 - 只是使用原始LineItem.create创建孤立的line_items。要绑定到购物车,您可以更改创建与购物车无关的LineItem的行:

current_item = LineItem.new(:product_id => product_id, :price => product_price)

在当前购物车的line_items集合中实际创建新订单项:

current_item = line_items.create(:product_id => product_id, :price => product_price)

还有其他一些你没有特别询问的失败,但无论如何我都调查了它们......

您的products.yml未指定id字段,因此在运行灯具时,line_items.yml中的product_id为1并不会最终引用任何产品。您可以在products.yml中对id: 1等进行硬编码以解决此问题。

接下来,CartsControllerTest中只有一个拼写错误 - @cart_id未定义,而应该是@cart.id

最后,它揭示了另一个问题,这实际上是一个逻辑问题。现在,您销毁产品的测试失败了,但这实际上是因为您的逻辑不允许您销毁具有line_items的产品(一旦我们修复了products.yml文件以指定了ID,您的产品就会这样做)。所以......我认为真的是测试错了,代码就在那里。