Shoulda-matcher Как проверить уникальность атрибута enum?

Я использую rspec-rails с shoulda-matcher для тестирования своей модели. Вот код:

user_ticket.rb

class UserTicket < ActiveRecord::Base
  belongs_to :user
  belongs_to :ticket

  enum relation_type: %w( creator supporter )

  validates_uniqueness_of :relation_type, scope: [:user_id, :ticket_id]
end

user_ticket_spec.rb

RSpec.describe UserTicket, type: :model do
  subject { FactoryGirl.build(:user_ticket) }

  describe 'Relations' do
    it { should belong_to(:user) }
    it { should belong_to(:ticket) }
  end

  describe 'Validations' do
    it { should define_enum_for(:relation_type).with(%w( creator supporter )) }
    # PROBLEM HERE
    it { should validate_uniqueness_of(:relation_type).case_insensitive.scoped_to([:user_id, :ticket_id]) }
  end
end

Когда я запускаю тестовый пример, результат всегда такой:

Failure/Error: it { should validate_uniqueness_of(:relation_type).case_insensitive.scoped_to([:user_id, :ticket_id]) }

     ArgumentError:
       'CREATOR' is not a valid relation_type

Я просто думаю, что сопоставитель должен проверять уникальность некоторых видов значений relation_type: прописные, строчные и т. д. Мой вопрос в этой ситуации: как пройти тест с такими определенными проверками модели?


person Hieu Pham    schedule 05.09.2016    source источник


Ответы (1)


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

Это проверка проверки с создателем и ТВОРЦОМ (как минимум). enum чувствительны к регистру, поэтому это будут два разных значения в enum, и вы только объявили создателя. Когда он пытается назначить CREATOR для проверки проверки, ваш enum расстраивается и отказывается разрешить это.

Вы можете захотеть проверить уникальность без учета регистра, и в этом случае вы хотите:

validate_uniqueness_of(:relation_type).ignoring_case_sensitivity

Из документов validates_uniqueness_of:

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

Используйте ignoring_case_sensitivity, чтобы пропустить эту проверку.

Или вы можете вообще пропустить проверки уникальности в своем тесте и полагаться на то, что rails допускает уникальные значения только в enum.

person Shadwell    schedule 05.09.2016
comment
о: пропустить проверки уникальности, а вдруг нам нужно использовать область видимости, validates_uniqueness_of :type, scope: :user_id, к сожалению эта проверка не работает в данном случае: it { is_expected.to validate_uniqueness_of(:type).scoped_to(:user_id) }. Так что нужно расширить shoulda или написать тест вручную - person Alexey Strizhak; 06.08.2019
comment
Кажется законным github.com/thoughtbot/shoulda-matchers/issues/997 - person emptywalls; 13.02.2020