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

使用thinkbotshoulda matchers 中的 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 中测试:包含验证

于 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 回答