2

我正在使用ShouldaRspec进行测试。

当我在我的测试规范中尝试这个时,当我没有在模型中进行验证时它会一直通过:

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

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

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

我该如何正确地写这个?

4

1 回答 1

4

True并且False不是字符串,所以不要使用 %w。

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

更新 - 2014 年 4 月 10 日

此验证在当前版本的 Shoulda 中不起作用,并且根据此最近的提交,它不会被修复,而是会引发异常。

由于分配给布尔字段的任何值都将被强制转换为 true(由 设置true, 1, '1', 't', 'T', 'true', 'TRUE')或 false(由其他任何设置),我测试布尔字段的首选方法如下:

  • 对于允许数据库中的空值的布尔值 - 不需要测试,任何可能的值都是有效的

  • 对于不允许在数据库中使用空值的布尔值 -在模型上设置it { should_not allow_value(nil).for(:field)时使用将通过validates :field, inclusion: { in: [true,false] }

于 2012-09-11T07:16:44.357 回答