9

ユーザーモデルが8文字未満のパスワードを持つことができないことを確認するためにいくつかの単体テストを書いています。

私はユーザーモデルから始めました:

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テスト:

describe User do
  subject { FactoryGirl.build :user }

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

ただし、これは実際に検証をテストするのではなく、ファクトリに8文字以上のパスワードがあることをテストするだけであることに気付きました。

有効なものをテストする以外に、これを行うための良い方法はありますか?0〜7文字のパスワードの方法?

私の理論では、7文字だけをテストし、誰かが誤って4文字のパスワードで問題ないことをハードコードした場合、これは検証に合格しますが、実際には意図したものではありません。パスワードが8文字を超えることに依存するコードが他にある可能性があり(可能性は低いですが、他の状況では真である可能性があります)、4のパスワードを許可することは正しくありません。

この場合、モデルのパスワード検証を変更した人は、自分が何か間違ったことをしたことを知りません。

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

4

2 に答える 2

20

Thoughtbotのshouldaマッチャーでensure_length_ofマッチャーを使用すると、次のことができます。

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

参照:RSpecを使用してRailsで:inclusion検証をテストするにはどうすればよいですか?

于 2012-10-28T22:07:54.797 に答える
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文字は問題ないという検証ルールを設定する必要があるためです。偶然に起こりそうなことではありません。

于 2012-10-28T18:30:24.473 に答える