我有以下连接表:
class ContactFormUsership < ApplicationRecord
belongs_to :user
belongs_to :contact_form
validates :user_id, presence: true, uniqueness: { scope: :contact_form_id }
end
它确保在创建行时没有重复的user
/ contact_form
配对。
我还在该表上有索引以确保数据库级别的独立性:
t.index ["user_id", "contact_form_id"], name: "index_contact_form_userships_on_user_id_and_contact_form_id", unique: true
我有一个回归测试,如下所示:
test 'An error is raised if a user is added to a form more than once' do
contact_form = ContactForm.create
user = users(:user_1)
assert_raises(ActiveRecord::RecordInvalid) do
2.times do
contact_form.users << user
end
end
end
但是这并没有测试在db级别创建重复行是不可能的。它只测试验证。
如何在数据库级别测试唯一性?没有验证,有没有办法让<<
?
由于您正在尝试测试ContactFormUsership表的行为,因此您可以执行以下操作:
test 'An error is raised if a user is added to a form more than once' do
contact_form = ContactForm.create
user = users(:user_1)
assert_raises(ActiveRecord::RecordInvalid) do
c1 = ContactFormUsership.new(user: user, contact_form: contact_form)
c1.save
c2 = ContactFormUsership.new(user: user, contact_form: contact_form)
c2.save(validate: false)
end
end
您可以在https://api.rubyonrails.org/classes/ActiveRecord/Validations.html找到有关validate:false的更多信息