Rails 5:当我对模型进行验证时,如何在数据库级别测试uniquess?

问题描述 投票:0回答:1

我有以下连接表:

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级别创建重复行是不可能的。它只测试验证。

如何在数据库级别测试唯一性?没有验证,有没有办法让<<

ruby-on-rails minitest
1个回答
2
投票

由于您正在尝试测试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的更多信息

© www.soinside.com 2019 - 2024. All rights reserved.