Derek
Derek

Reputation: 12378

Rails 4 rspec test failing on numericality only_integer on boolean value?

I have in my model

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

in my spec

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

The above test fails, but since I set is_foo to a boolean and not an integer, should the test pass?

Are booleans considered integers in ruby? Because when I did

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

Upvotes: 0

Views: 1629

Answers (2)

Derek
Derek

Reputation: 12378

I guess ruby/rails substitutes 1 for true to a model class attribute when the attribute expects an integer. So the test failed because it was comparing 1 to an integer.

Upvotes: 0

Chris Heald
Chris Heald

Reputation: 62648

The spec is correct. 1 is truthy (the only non-truthy values in Ruby are false and nil), but it is not a boolean. Booleans are not numeric; they are their own type. A numericality validation will validate that the type is actually numeric, and boolean is not numeric.

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

What you probably want instead, though, is a validation that tests for a boolean value:

validates :is_foo, inclusion => {:in => [true, false]}

Upvotes: 1

Related Questions