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 设置为布尔值而不是整数,所以测试应该通过吗?

布尔值在红宝石中被视为整数吗?因为当我这样做的时候

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 用 1 代替模型类属性的 true 。所以测试失败了,因为它正在将 1 与整数进行比较。

于 2013-08-16T21:04:37.347 回答