1

我正在阅读“使用 Rails 进行敏捷 Web 开发”,但我无法理解单元测试。

有一个这样定义的模型:

class Product < ActiveRecord::Base
  # .....
  validates :price, numericality: {greater_than_or_equal_to: 0.01}
  # .....
end

和测试:

  test "product price must be positive" do
    product = Product.new(
      title: "my 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]

    product.price = 0
    assert product.invalid?
    assert_equal ["must be greater than or equal to 0.01"],
      product.errors[:price]

    product.price = 1
    assert product.valid?

  end

为什么我们需要这个:

    assert_equal ["must be greater than or equal to 0.01"],
      product.errors[:price]

为什么要比较错误消息?而不是编写这样的测试:

product.price = -1
assert product.invalid?, "must be greater than or equal to 0.01"

product.price = 0
assert product.invalid?, "must be greater than or equal to 0.01"
4

2 回答 2

1

据我了解,这本书的作者真的很想验证错误消息是否是他所期望的。

在我看来,硬编码错误消息是一个非常糟糕的主意,因为它可能会在下一个框架版本中更改。

于 2013-10-30T10:55:59.470 回答
0

object.errors是一个空白哈希。保存/更新 ActiveModel 实例时,如果验证失败,则会将错误添加到与属性匹配的特定键中,例如:

{ price: "must be...", name: "can't be blank", ...}.

在这种情况下,验证失败的是“价格”。所以错误对象是

{ price: "must be greater than or equal to 0.01"}

访问消息字符串。您需要将失败的属性作为键,例如errors[:price]

于 2013-10-26T08:37:32.487 回答