ShouldaMatchers validate_uniquess_of 范围为多列

ShouldaMatchers validate_uniquess_of scoped to multiple columns

我有一个模型,该模型在数据库级别具有唯一索引,并且模型验证检查范围为多列的唯一性。

# db level
add_index :table1, %i[fk_belongs_to_id col1 col2 col3 col4], unique: true

# model level
validates :fk_belongs_to_id, uniqueness: { scope: %i[col1 col2 col3 col4], case_sensitive: false }

在规范中我有:

it { should validate_uniqueness_of(:fk_belongs_to_id).scoped_to(%i[col1 col2 col3 col4).ignoring_case_sensitivity }

但是我一直收到这个错误:

    NoMethodError:
       undefined method `all' for Symbol:Class

如何测试多列的唯一性范围?

我无法在他们的文档或任何东西中找到任何可以帮助解决这个问题的东西。感谢您的帮助!

结果是我需要在规范中定义一个subject。我只播种了与此相关的错误 reflect_on_assocation.

所以为了澄清,我刚刚添加了

subject { Model.new } 成功了 :P

您解决了自己的问题,这太棒了,但只是对未来读者的快速解释说明:

it { should ... }(以及备选方案 it { is_expected.to ... })在幕后翻译为 expect(subject).to ...。因此,两者都假设当前上下文已经定义了 subject.

另一件需要注意的事情是,虽然 RSpec 继续支持 shouldexpect 语法,但一般指导是坚持使用 expect。在你的情况下,它并不重要,因为 should 直接转换为 expect,但在更一般的用法中,expect 解决了旧语法的几个问题。查看来自 RSpec 的 summary 了解原因。