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 が 2 つの違いを出力しない限り失敗します。

次の行を仮定するのは正しいですか:

assert_equal "0.01 以上でなければなりません" ,

意味:

assert_equal ("must be greater or equal to 0.01", , ) #act または msg なし。

また、誰かが次の行が使用している配列とその目的を説明できますか?

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

配列がどこにあるのか、作者が参加して何を達成しているのか把握できません。

情報をお寄せいただきありがとうございます。

この本は: Rails 4th Edition を使用したアジャイル Web 開発

4

1 に答える 1

2

完全なアサーションは、次のように 1 行で表されます。

 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") は 1 つしかないため、join メソッドはセパレーターを追加せずに同じ値を返すだけです。したがって、アサーションは合格するはずです。

この場合の動作を説明する例join(';'):

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

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