【问题标题】:Testing password length validation with RSpec使用 RSpec 测试密码长度验证
【发布时间】:2012-10-18 03:49:41
【问题描述】:

我正在编写一些单元测试以确保用户模型的密码长度不能小于 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 正确测试这种情况。

【问题讨论】:

  • 我不明白你的问题..

标签: ruby-on-rails validation rspec tdd


【解决方案1】:

使用thoughtbot 的shoulda matchers 中的ensure_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

【讨论】:

  • 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 个可以。不是偶然发生的事情。

【讨论】:

  • 这实际上是我们已经拥有的。 “不太可能”意味着它仍然是可能的,并且是试图解决如何避免的问题。不过谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 2017-04-25
相关资源
最近更新 更多