3

我无法理解我正在阅读的书中的一大段代码。

这是代码:

test "product price must be positive" do
  product = Product.new(:title => "My Book Title", :description => "yyy", :image_url => "zzz.jpg")
  product.price = -1

  assert product.invalid?
  assert_equal "must be greater than or equal to 0.01", product.errors[:price].join('; ' )

  product.price = 0
  assert product.invalid?

  assert_equal "must be greater than or equal to 0.01", product.errors[:price].join('; ' )
  product.price = 1
  assert product.valid?
end

形成我得到的红宝石文档:

assert_equal (exp, act, msg = nil)

如果可能,除非 exp == act 打印两者之间的差异,否则失败。

我是否正确地假设该行:

assert_equal "必须大于等于 0.01" ,

方法:

assert_equal ("must be greater than or equal to 0.01", , ) #with no act or msg.

另外,有人可以解释下一行使用什么数组以及做什么用的吗?

product.errors[:price].join(';')

我无法掌握数组在哪里以及作者通过加入实现了什么。

提前感谢您提供任何信息。

这本书是:Agile Web Development with Rails 4th Edition

4

1 回答 1

2

完整的断言在一行中,如下所示:

 assert_equal "must be greater than or equal to 0.01" , product.errors[:price].join('; ' )

在这里,exp = "must be greater than or equal to 0.01"act = product.errors[:price].join('; ' )

product.errors[:price]是一个数组,包含多个错误消息。

链接.join(';')到它是使所有错误消息与';'连接在一起 作为分隔符。

在这种情况下,只有一个错误 ( "must be greater than or equal to 0.01"),因此join 方法只是返回相同的值而不添加分隔符。因此断言应该通过。

举例说明join(';')在这种情况下的行为:

> ['a', 'b'].join(';')
=> "a;b" 

> ['a'].join(';')
=> "a" 
于 2013-03-15T18:43:59.540 回答