如何更改 shoulda 匹配器的主题

Pab*_*blo 4 ruby ruby-on-rails shoulda

我在班级中遇到以下属性的问题。我有一个存在为 true 的日期属性,该属性也在数据库级别强制执行:

validates :date, presence: true

除此之外,我需要强制以下两个属性的组合唯一性

validates :name, uniqueness: { scope: :parent_id }
Run Code Online (Sandbox Code Playgroud)

到目前为止......一切都很好,但我想要一个测试唯一性的规范

it { should validate_uniqueness_of(:name).scoped_to(:parent_id) }

但上面这一行的问题是,它会尝试通过使用随机名称和parent_id 值(让日期为nil)来在数据库上插入一条记录。因此,它在数据库上失败。

我已经尝试过进行subject { build(:my_model) }测试,但是 it 行仍在创建它自己的测试,并且没有设置日期属性。

我怎样才能让shoulda使用我创建的主题?我错过了什么?

sgr*_*rif 5

应该匹配器需要在数据库中创建一个单独的记录来测试它不唯一的情况。它会跳过 Rails 验证来执行此操作,但无法跳过数据库验证。如果您手动创建一个,它将使用它。将您的测试更改为:

subject { FactoryGirl.build(:my_model) }
it { should validate_uniqueness_of(:name).scoped_to(:parent_id) }
Run Code Online (Sandbox Code Playgroud)

shoulda 匹配器文档对此进行了更深入的介绍。 https://www.rubydoc.info/gems/shoulda-matchers/Shoulda%2FMatchers%2FActiveRecord:validate_uniqueness_of