Rails 4 validates_inclusion_of和shoulda_matchers测试工作很奇怪

时间:2015-08-11 15:29:45

标签: ruby-on-rails validation rspec shoulda

我在模型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)>'

但是,我在另一个模型中有相同的验证和测试,并且它工作正常。

你能帮我看看这里发生了什么吗?

1 个答案:

答案 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模型中使用布尔值,那么这些测试无论如何都是必要的。