使用RSpec测试密码长度validation

我正在编写一些unit testing,以确保用户模型的密码长度不超过8个字符。

我开始使用User模型:

class User { :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 

但是我意识到这实际上并没有测试我的validation,只是测试我的工厂有一个> = 8个字符的密码。

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

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

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

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

在thinkbot的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中的包含validation

我不知道这是否能回答你的问题,但我认为你这样做是安全的:

 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个字符的密码,有人必须设置一个validation规则,说4个字符没问题,7个不正常,但8个没问题。 不是偶然发生的事情。