如何改变shoulda匹配器的主题

时间:2014-01-12 14:55:18

标签: ruby-on-rails ruby shoulda

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

validates :date, presence: true

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

validates :name, uniqueness: { scope: :parent_id }

到目前为止......一切正常,但我希望有一个测试唯一性的规范

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

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

我已经尝试在测试中执行subject { build(:my_model) },但是它仍在创建它自己的那一行而不是设置日期属性。

如何使用我创建的主题?我错过了什么?

1 个答案:

答案 0 :(得分:4)

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

subject { FactoryGirl.build(:my_model) }
it { should validate_uniqueness_of(:name).scoped_to(:parent_id) }

在shoulda matchers文档中对此进行了更深入的介绍。 http://www.rubydoc.info/github/thoughtbot/shoulda-matchers/Shoulda/Matchers/ActiveRecord#validate_uniqueness_of-instance_method