2016-09-05 4 views
0

Я использую rspec-рельсы с инструктором для тестирования моей модели. Вот код:Вставить комментарий Как проверить уникальность атрибута enum?

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: в верхнем регистре, в нижнем регистре и т. д. Мой вопрос в этой ситуации, как сделать тестовый проход с такой определенной валидацией модели?

ответ

3

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

Он тестирует валидацию с помощью «создателя» и «СОЗДАНИЯ» (по крайней мере). enum s чувствительны к регистру, поэтому они должны быть двух разных значений в enum, и вы только объявили «создателем». Когда он пытается назначить «CREATOR» для проверки валидации, ваш enum расстраивается и отказывается его разрешить.

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

validate_uniqueness_of(:relation_type).ignoring_case_sensitivity 

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

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

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

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