2011-10-15 15 views
10

新しいユーザー作成も管理設定で構成されているかどうかをテストするためのテストを書きました。ここではテストがある:Rspecの検証に失敗しました - 属性を空白にすることはできませんが、空白ではありません

describe User do 

    before(:each) do 
    @attr = { 
     :name => "Example User", 
     :email => "[email protected]", 
     :admin => "f" 
    } 
    end 

    it "should create a new instance given valid attributes" do 
    User.create!(@attr) 
    end 

    it "should require a name" do 
    no_name_user = User.new(@attr.merge(:name => "")) 
    no_name_user.should_not be_valid 
    end 

    it "should require an email" do 
    no_email_user = User.new(@attr.merge(:email => "")) 
    no_email_user.should_not be_valid 
    end 

    it "should require an admin setting" do 
    no_admin_user = User.new(@attr.merge(:admin => "")) 
    no_admin_user.should_not be_valid 
    end 

end 

その後、私は私のUserモデルに:

class User < ActiveRecord::Base 
    attr_accessible :name, :email, :admin 

    has_many :ownerships 
    has_many :projects, :through => :ownerships 

    email_regex = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 

    validates :name, :presence => true, 
        :length => { :maximum => 50 } 

    validates :email, :presence => true, 
        :format => { :with => email_regex }, 
        :uniqueness => { :case_sensitive => false } 

    validates :admin, :presence => true 

end 

私は明らかに管理者設定を使用して、新しいユーザーを作成し、なぜそれが偽だと言っていますか?管理者設定の移行をadmin:booleanとして作成しました。私は間違ったことをしましたか?

ここでエラーです:私はコメントアウトしたときに、奇妙なことに

Failures: 

    1) User should create a new instance given valid attributes 
    Failure/Error: User.create!(@attr) 
    ActiveRecord::RecordInvalid: 
     Validation failed: Admin can't be blank 
    # ./spec/models/user_spec.rb:14:in `block (2 levels) in <top (required)>' 

検証:管理者、:存在は=> trueの場合、テストが正しく、ユーザーが作成されますが、上の失敗「ユーザーは、管理者の設定を必要とすべきである」

編集:@attr:adminの値を "t"に変更すると機能します!値がfalseの場合、なぜ動作しませんか? rails guidesから

+0

実際のエラーが役に立ちます。 – bricker

+0

障害: 1)有効な与えられた新しいインスタンスを作成する必要があり、ユーザーは 失敗/エラー属性:User.create(@ attrという) のActiveRecord :: RecordInvalid:! 検証に失敗しました:管理者が空白 #の./specすることはできません/models/user_spec.rb:14:in 'ブロック(2レベル)' –

答えて

25

Since false.blank? is true, if you want to validate the presence of a boolean field you should use validates :field_name, :inclusion => { :in => [true, false] }.

ActiveRecordの検証前にfalseに、あなたの「F」を変換している、そしてそれはfalse.blank?を実行し、trueを返します(フィールドが存在しないことを意味する)のような基本的には、それが見えます検証が失敗する原因となります。だから、あなたの検証を変更する、あなたのケースでそれを修正する:

validates :admin, :inclusion => { :in => [true, false] } 

は私には少しハックようだ...うまくいけば、Railsの開発者は、将来のリリースでこれを再検討します。