使用RSpec测试密码长度验证

时间:2012-10-28 17:41:29

标签: ruby-on-rails validation rspec tdd

我正在编写一些单元测试,以确保用户模型不能拥有密码< 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 test:

describe User do
  subject { FactoryGirl.build :user }

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

但是我意识到这实际上没有测试我的验证,只是测试我的工厂有一个密码&gt; = 8个字符。

除了测试有效之外,还有一种很好的方法吗? 0-7字符密码的方法?

我的理论是,如果我只测试7个字符,并且有人意外硬编码,那4个字符的密码就可以了,这将通过验证,但实际上不是预期的。 可能有一些代码,其中取决于密码超过8个字符(不太可能,但在其他情况下可能是真的),因此允许密码4是不正确的。

在这种情况下,更改模型中密码验证的人不会知道他们做错了什么。

我只想知道如何使用TDD正确测试这样的情况。

2 个答案:

答案 0 :(得分:18)

在思想机器人ensure_length_of中使用shoulda matchers匹配器,您可以执行此操作:

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 :(得分: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个没问题。不是偶然发生的事情。