我在模型violin.rb
中进行了验证:
validates :bow_included, presence: true
validates_inclusion_of :bow_included, in: [true, false]
在我的spec文件violin_spec.rb
中,我有以下内容(我使用shoulda_matchers
gem):
it { should validate_presence_of :bow_included }
it { should validate_inclusion_of(:bow_included).in_array([true, false]) }
当我进行测试时,我得到了这个:
1)小提琴验证应确保包含bow_included [true,false]
Failure/Error: it { should validate_inclusion_of(:bow_included).in_array([true, false]) } [true, false] doesn't match array in validation # ./spec/models/violin_spec.rb:17:in `block (3 levels) in <top (required)>'
但是,我在另一个模型中有相同的验证和测试,并且它工作正常。
你能帮我看看这里发生了什么吗?
答案 0 :(得分:1)
如果您查看他们的文档,他们会说他们不推荐这个并且会产生警告:https://github.com/thoughtbot/shoulda-matchers/blob/master/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb#L52
tl; dr是:
从来没有布尔列可以是任何东西的情况 true,false或nil,因为ActiveRecord将对输入值进行类型转换 这三个值中的一个。这意味着我们没有任何办法 在测试中反驳这个逻辑。
我知道这并不是直接回答你的问题,但如果你在AR模型中使用布尔值,那么这些测试无论如何都是必要的。