Ensure_inclusion_of会在失败时继续传递吗?

时间:2012-09-10 18:07:34

标签: ruby-on-rails ruby-on-rails-3 rspec-rails shoulda

我正在使用ShouldaRspec进行测试。

当我在我的测试规范中尝试这个时,它在我没有在模型中完成验证时继续传递:

it { should ensure_inclusion_of(:private).in_array(%w[true false]) }

该属性是一个真或假的布尔值:

validates_inclusion_of :private, :in => [true, false]

我该如何正确地写这个?

1 个答案:

答案 0 :(得分:4)

TrueFalse不是字符串,因此请勿使用%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}}