当我在我的测试规范中尝试这个时,它在我没有在模型中完成验证时继续传递:
it { should ensure_inclusion_of(:private).in_array(%w[true false]) }
该属性是一个真或假的布尔值:
validates_inclusion_of :private, :in => [true, false]
我该如何正确地写这个?
答案 0 :(得分:4)
True
和False
不是字符串,因此请勿使用%w。
it { should ensure_inclusion_of(:private).in_array([true, false]) }
更新 - 2014年4月10日
此验证在当前版本的Shoulda中不起作用,并且根据this recent commit,它不会被修复,而是会引发异常。
由于分配给布尔字段的任何值都将转换为true(由true, 1, '1', 't', 'T', 'true', 'TRUE'
设置)或false(由其他任何设置),我测试布尔字段的首选方法如下:
对于允许数据库中为空的布尔值 - 不需要测试,任何可能的值都是有效的
对于不允许数据库中为空的布尔值 - 使用it { should_not allow_value(nil).for(:field)
,当模型上设置validates :field, inclusion: { in: [true,false] }
时将使用{<1}}