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 に答える