2011-07-20 9 views
4

ユーザモデルのテストケースを作成しようとしています。基本的には、first_nameとlast_nameが存在することを検証します。Rails 3.1 Rspecモデルの検証ケースの作成

私がしようとしているのは、特定のフィールドのエラーが空であるかどうかをチェックすることです。空でなければなりません。しかし、それは常に失敗します。

これを行う正しい方法は何ですか?私user.rbファイルをここで

私のコードは私のuser_spec.rbで

ある

require 'spec_helper' 

describe User do 

    before do 
    @user = User.new 
    end 

    it "must have a first name" do 
    @user.errors[:first_name].should_not be_empty 
    end 

    it "must have a last name" do 
    @user.errors[:last_name].should_not be_empty 
    end 
end 

class User < ActiveRecord::Base 
    validates :first_name, :presence => true 
    validates :last_name, :presence => true 
end 

答えて

16

RSpecのは、 "暗黙の" 対象の概念をサポートしています。 "describe"ブロックへの最初の引数がクラスの場合、RSpecは自動的にそのクラスのインスタンスをあなたの仕様で利用可能にします。 http://relishapp.com/rspec/rspec-core/v/2-6/dir/subject/implicit-subjectを参照してください。 RSpecの出力になり

require 'spec_helper' 

describe User do 

    it "must have a first name" do  
    subject.should have(1).error_on(:first_name) 
    end 

    it "must have a last name" do 
    subject.should have(1).error_on(:last_name) 
    end 
end 

(--formatドキュメントを使用している場合):

User 
    must have a first name 
    must have a last name 

あなたはRSpecの出力はデフォルトで満足している場合は、さらにそれを省略することができます:

require 'spec_helper' 

describe User do 
    it { should have(1).error_on(:first_name) } 
    it { should have(1).error_on(:last_name) } 
end 

この結果、

User 
    should have 1 error on :first_name 
    should have 1 error on :last_name 
18

あなたは、単に、同様にこれを行うことによってテストすることができます。

describe 'validations' do 
    it { should validate_presence_of :firstname } 
    it { should validate_presence_of :lastname } 
end 

は、すべての標準的なRailsの検証のためのshoulda matchersを見てみましょう。 この方法は単なる簡潔なものではなく、肯定的な場合も処理します。つまり、以下のシナリオをテストする必要はありません。

it "passed validations when first_name is set" 
    user = User.create(:firstname => 'f', :lastname => 'l') 
    user.errors[:first_name].should be_empty 
    user.errors[:last_name].should be_empty 
end 
+2

将来の視聴者のためにUpvoted。検証をテストするために、shoulda matchersはよりエレガントです。 – MikeH

+1

の代わりに 'it 'と記述するのは..." do'それは '{validate_presence_of:firstname}'を使う方が良いでしょう。 – morgents

+0

@moregeekが提案した新しく優れた構文に基づいて答えを更新しました – jake

関連する問題