我正在编写一些单元测试,以确保用户模型不能拥有密码< 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正确测试这样的情况。
答案 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个没问题。不是偶然发生的事情。