【问题标题】:Rails 4 validates_inclusion_of and shoulda_matchers test work weird [duplicate]Rails 4 validates_inclusion_of 和 shoulda_matchers 测试工作很奇怪[重复]
【发布时间】:2015-08-11 15:29:45
【问题描述】:

我的模型 violin.rb 中有此验证:

  validates :bow_included, presence: true
  validates_inclusion_of :bow_included, in: [true, false]

在我的规范文件 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 包含在 [真假]

 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)>'

但是,我在另一个模型中进行了相同的验证和测试,并且效果很好。

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

【问题讨论】:

    标签: ruby-on-rails validation rspec shoulda


    【解决方案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 模型中使用布尔值,那么无论如何都不需要进行这些测试。

    【讨论】:

    • 好吧,我认为我需要测试,因为对于布尔列,测试如下:it { should allow_value("whatever").for(:bow_included) } 通过没有任何问题。
    • 如果没有记错的话,这只是将类型转换为 true。
    • 这里得到了更彻底的回答:stackoverflow.com/questions/5170008/…
    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 2014-08-15
    • 2011-05-07
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多