3

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

# 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

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

我无法在他们的文档或任何内容中找到任何可以帮助解决此问题的内容。谢谢你的帮助!

4

2 回答 2

2

您解决了自己的问题,这很棒,但只是为未来的读者快速解释一下:

it { should ... }(和替代方法it { is_expected.to ... })在封面下翻译为expect(subject).to .... 因此,两者都假设在此之前当前上下文已定义subject.

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

于 2020-06-29T22:37:08.107 回答
1

事实证明,我需要subject在规范中定义 a。我只将与此相关的错误播种为reflect_on_assocation.

所以为了澄清,我只是添加了

subject { Model.new }它起作用了:P

于 2020-06-29T17:36:42.030 回答