0

私は自分のモデルに持っています

validates :is_foo, presence: true, numericality: {only_integer:true, less_than_or_equal_to: 1, greater_than_or_equal_to: 0}

私のスペックでは

  describe "when is_foo is not an integer" do
    before {@user.is_foo = true}
    it {should_not be_valid}
  end

上記のテストは失敗しますが、is_foo を整数ではなくブール値に設定したので、テストは成功するでしょうか?

Rubyではブール値は整数と見なされますか? なぜなら、私がしたとき

true.to_i # error
true == 1 # false
false == 0 # false
4

2 に答える 2

1

スペックは正しい。1 は真です (Ruby で真でない値は false と nil だけです) が、ブール値ではありません。ブール値は数値ではありません。彼らは彼ら自身のタイプです。数値検証では、型が実際に数値であり、ブール値が数値ではないことを検証します。

> true.class
=> TrueClass
> 1.class
=> Fixnum

ただし、おそらく代わりに必要なのは、ブール値をテストする検証です。

validates :is_foo, inclusion => {:in => [true, false]}
于 2013-08-14T19:05:49.917 に答える
0

Ruby/Rails は、モデル クラスの属性が整数を想定している場合、true を 1 に置き換えていると思います。1 を整数と比較していたため、テストは失敗しました。

于 2013-08-16T21:04:37.347 に答える