2012-10-28 1 views
8

私はUserモデルが8文字のパスワードを持つことができないようにいくつかのユニットテストを書いています。RSpecを使ってパスワードの長さを検証する

私はUserモデルで開始しました:私は、これは実際に私の検証をテストしていないことに気づいたしかし、それだけでは私のテスト

describe User do 
    subject { FactoryGirl.build :user } 

its(:password) { should have_at_least(8).items } 
end 

class User < ActiveRecord::Base 
    ... 
    validates :password, :length =>{ 
    :minimum => 90, 
    :too_short => "password is too short, must be at least %{count} characters" 
    }, :on => :create 

end 

そしてuser_spec.rbテスト工場のパスワードは8文字以上です。

有効なテスト以外の方法がありますか? 0-7文字のパスワードのためのメソッド?

私の理論では、私は7文字しかテストしておらず、誤って4文字のパスワードが妥当であるというコードを書いていると、これは検証に合格しますが、意図したものではありません。 パスワードが8文字以上(他の状況では真実ではない可能性がある)に依存するコードがいくつか存在する可能性があるため、パスワード4を許可するのが間違っています。

この場合、モデルでパスワードの検証を変更した人は、何か間違っていることを知らないでしょう。

このような状況を適切にTDDでテストする方法を知りたいだけです。

+0

は、私はあなたの問題を理解していない... – apneadiving

答えて

16

thoughtbotのshoulda matchersensure_length_ofマッチャーを使用して、あなたはこれを行うことができます。

describe User do 
    it { should validate_length_of(:password).is_at_least(8) 
             .with_message(/password is too short/) } 
end 

も参照してください:How can I test :inclusion validation in Rails using RSpec

+1

'ensure_length_of'は廃止予定です。代わりに 'validate_length_of'を使用してください。 –

2

これは、あなたの質問に答えるかどうかはわからないが、私はあなたがこのような何かを持つ安全であると思う:

class User < ActiveRecord::Base 
    validates :password, :length => {:minimum => 8 } 
end 

describe User do 
    it "validates password length" do 
    FactoryGirl.build(:user, password: "1234567").should_not be_valid 
    FactoryGirl.build(:user, password: "12345678").should be_valid 
    end 
end 

理由は、4文字のパスワード誰かを通過させるために、このテストのために持っているだろうということです4文字は大丈夫、7は大丈夫だが、8は大丈夫だと言う検証規則を設定している。事故によって起こる可能性の高いものではありません。

+0

これは、我々がすでに持っている効果的にするものです。 「そうでない可能性が高い」とは、それがまだ可能であることを意味し、回避する方法を試していたものです。しかし、ありがとう! –

関連する問題