【发布时间】:2014-04-23 15:32:32
【问题描述】:
我有一个具有唯一性验证的 ActiveRecord 模型:
class Profile < ActiveRecord::Base
# fields: :name, :slug
before_validation :set_default_slug_from_name
validates :slug, uniqueness: {case_sensitive: false},
unless: -> { |p| p.slug.blank? }
# ...
end
现在,在编写此模型的规范时,我想模拟唯一性验证错误而不访问数据库,这样我就可以测试一些依赖于此类错误的模型行为:
describe Profile
before { subject.name = "Bob Greenfield" }
it "modifies the beginning of the slug if there is a duplicate" do
# simulate uniqueness conflict (duplicate record) here
subject.valid?
expect(subject.slug).to match(/^\w+-bob-greenfield$/)
end
end
我研究了实现UniquenessValidator 的Rails code 并尝试了以下操作:
allow_any_instance_of(ActiveRecord::Relation).to receive(:exists?).and_return(true)
# ...
但这似乎不起作用。
【问题讨论】:
标签: ruby-on-rails activerecord rspec activemodel