2016-09-05 17 views
0

モデルをテストするには、rspec-railsとshoulda-matcherを使用します。ここでは、コードです: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値で大文字、小文字、...などの一意性を検証する必要があります。私の質問はこのような状況で、そのような定義されたモデルバリデーションでテストをパスする方法ですか?

答えて

3

検証のケースを無感応にテストするように依頼しているため、失敗しています。通常、これは、異なるケースで検証の失敗を引き起こす一連の値をテストするために使用されます。しかし、enumのために値を設定することさえできません。それは妥当性検査に至ることさえありません。

「作成者」と「CREATOR」(少なくとも)を使用して検証をテストしています。 enumは大文字と小文字が区別されるため、enumの2つの異なる値になり、「作成者」だけが宣言されています。検証をテストするために「CREATOR」を割り当てようとすると、enumが動揺し、許可を拒否します。 validates_uniqueness_ofドキュメントから

validate_uniqueness_of(:relation_type).ignoring_case_sensitivity 

あなたが欲しい、その場合には大文字と小文字を区別せずに一意性を検証することをお勧めしますデフォルトでは

、validate_uniqueness_ofは検証が大文字と小文字が区別されていることを確認します:既存のレコードの対応する属性とは異なる場合に、一意の属性が検証をパスすることを主張します。

このチェックをスキップするにはignoring_case_sensitivityを使用してください。

または、テストでの一意性チェックをスキップし、レールでenumの一意の値のみを使用できると信頼することができます。

関連する問題