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

Ruby on rails 为什么我的单元测试失败了?,ruby-on-rails,ruby-on-rails-3,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! asse

你好,让我的单元测试通过有点问题。具体来说,*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
这是我的存储库:


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

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

current_item = LineItem.new(:product_id => product_id, :price => product_price)
要在当前购物车的行项目集合中实际创建新的行项目,请执行以下操作:

current_item = line_items.create(:product_id => product_id, :price => product_price)
还有一些你没有特别问到的失败,但我还是调查了一下

Your products.yml没有指定id字段,因此第_items.yml行中1的product_id在运行装置时不会引用任何产品。您可以在products.yml中硬编码id:1等来解决此问题

接下来,CartsControllerTest中有一个输入错误--
@cart\u id
没有定义,应该是
@cart.id


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

单元测试似乎在做他们应该做的事情,而程序本身也有问题。我同意。。那么为什么这个项目会有问题呢?这是一个非常大的问题。错误是什么样子的?顺便说一句,为了解释行项目。创建构造,您的产品定义为
有许多行项目。因此,您可以在产品上下文中引用行_项。Rails为您提供了一系列自动生成的方法,这些方法包含许多项。更多信息可以在这里找到:这是一个使用
others.create(…)
销毁失败产品的测试在哪里?顺便说一句,现在我正在查看product.rb(第21行),我有“if line_items.count.zero?”。是否应该改为“if self.line_items.count.zero”?再次感谢您提供的非常有用的答案
line\u items.count.zero?
可以,但问题是,您确实有一些与您的产品相对应的行项目(现在设备正在引用它们),因此您自己的代码不允许您删除它们。因此,您可能希望修改您的测试,以确保在这种情况下删除失败,而不是期望它成功。然后,您可以添加另一个测试,尝试删除没有行项目的产品,这应该会成功。很高兴这有帮助:)