Если при проверке уникальности происходит совпадение с ActiveRecord::AssociationTypeMismatch

Я разрабатываю Rails5 API и получаю ActiveRecord::AssociationTypeMismatch: ошибка при тестировании ассоциаций моделей. Вот код:

user.rb:

class User < ApplicationRecord
  acts_as_paranoid
  has_secure_password

  has_many :contracts
end

service.rb:

class Service < ApplicationRecord
  acts_as_paranoid

  has_many :contracts
end

contract.rb:

class Contract < ApplicationRecord
  acts_as_paranoid

  belongs_to :user
  belongs_to :service

  validates_presence_of :user
  validates :service, presence: true, uniqueness: { scope: :user_id }
end

contract_spec.rb:

RSpec.describe Contract, type: :model do
  let(:contract) { create(:contract) }

  describe 'Validations' do
    it { is_expected.to validate_presence_of(:user) }
    it { is_expected.to validate_presence_of(:service) }
    it { is_expected.to validate_uniqueness_of(:service).scoped_to(:user_id) }
  end

  describe 'Associations' do
    it { is_expected.to belong_to(:user) }
    it { is_expected.to belong_to(:service) }
  end
end

Мои тесты не проходят с:

1) Contract Validations should validate that :service is case-sensitively unique within the scope of :user_id
     Failure/Error: it { is_expected.to validate_uniqueness_of(:service).scoped_to(:user_id) }

     ActiveRecord::AssociationTypeMismatch:
       Service(#47073011870820) expected, got String(#47072966778980)

Мне кажется, некоторые другие вопросы выглядят так, но ни у одного из них не было рабочего решения этой проблемы. Любая помощь будет оценена.

1 ответ

Я столкнулся с той же проблемой. Одним из обходных путей является определение subject

describe 'Validations' do
  subject { create(:contract) }

  it { is_expected.to validate_presence_of(:user) }
  it { is_expected.to validate_presence_of(:service) }
  it { is_expected.to validate_uniqueness_of(:service).scoped_to(:user_id) }
end

Источник: validates_uniqueness_of не работает, когда запись новая и атрибут является ассоциацией

Другие вопросы по тегам