ruby-on-rails - rails : Validating inclusion of a boolean fails tests

标签 ruby-on-rails unit-testing validation boolean

我试图确保我的模型的一个字段是一个 boolean 值,但我的测试一直失败。

看完这篇:Validating boolean value in Rspec and Rails而这个 Rails: how do I validate that something is a boolean?我最终这样做了:

class Model < ActiveRecord::Base

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

end

我试过用几种不同的方式测试这个(使用 rspec 和 shoulda 匹配器),并且由于我的测试一直失败,我现在采用最愚蠢的(?)方式。尽管如此,测试并没有通过,我猜测有某种机制可以在某处转换值。

这是我用来了解发生了什么的方法:
# create instance without setting value ...

# these work as expected
model_instance.valid?.should be_false      # passes
model_instance.my_field = true
model_instance.valid?.should be_true       # passes
model_instance.my_field = false       
model_instance.valid?.should be_true       # passes

# works as expected
model_instance.my_field = ""
model_instance.valid?.should be_false      # passes

# these should pass but fail
model_instance.my_field = "foo"
model_instance.my_field.should == "foo"    # fails as well, my_field == false
model_instance.valid?.should be_false      # fails

model_instance.my_field = "false"
model_instance.my_field.should == "false"  # fails as well, my_field == false
model_instance.valid?.should be_false      # fails

model_instance.my_field = "123"
model_instance.valid?.should be_false      # fails

model_instance.my_field = "true"
model_instance.my_field.should == "true"   # fails as well, my_field == true
model_instance.valid?.should be_false      # fails

我错过了什么?
似乎该值以某种合乎逻辑的方式进行了转换,但是在哪里以及如何防止它?如何正确进行这种验证?

最佳答案

我不知道你需要验证 boolean 字段为真/假的想法从何而来,但我最近在一些不相关的项目中看到了它,所以我开始怀疑这是否不是一个模因从某处开始。

它是一个 boolean 字段,它必须为真或假。 AR 会为您处理 boolean 值的实现细节。如果需要 boolean 字段,请在数据库中创建一个 boolean 字段。故事结局。

查看源代码,这是将值转换为 boolean 值的代码:

# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 147
147:         def value_to_boolean(value)
148:           if value.is_a?(String) && value.blank?
149:             nil
150:           else
151:             TRUE_VALUES.include?(value)
152:           end
153:         end

以下是等同于它们的 boolean 值的值:
TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE'].to_set
FALSE_VALUES = [false, 0, '0', 'f', 'F', 'false', 'FALSE'].to_set

所以再看看你上面的代码,一切都应该是这样,除了你期望的不正确。将 "foo"分配给一个 boolean 值,我们看到 "foo"不在可接受的真值列表中,所以 boolean 字段默认为 false,这是稍后将从其访问器返回的内容。该字段的 boolean 值仍然是 :in => [true, false]所以模型是有效的。 "false"和 "123"因同样的原因失败。 “true”是 boolean 值 true 的可接受值,因此该字段被设置为 true 并且由于上述原因仍然有效。

关于ruby-on-rails - rails : Validating inclusion of a boolean fails tests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5170008/

相关文章:

ruby-on-rails - Rails 路由 : what is the difference between :conditions and :requirements in routing?

unit-testing - 测试自定义箱子

php - 为 REST-ful API 编写单元测试

angular - 如何对 Angular @Output 进行单元测试

jquery - 在 fullcalendar.js 的事件中渲染 HTMLS 标签

ruby-on-rails - 制作我的第一颗 gem - 我从哪里开始?

javascript - jquery 验证插件中的 errorClass?

javascript - 检查多个选择下拉列表中的重复值

ruby - 迭代所有 mongoid 字段的最佳方法

ruby-on-rails - 使用 Ruby on Rails 了解 Test::Unit 中的 assert_equal