我有以下简化模型:
class User
attr_accessible :password
validates :password, :presence => true
validates_confirmation_of :password, :length => { :minimum => 4 }
end
这很直截了当。我正在用RSpec / FactoryGirl进行测试,并进行了以下测试:
it "cannot create with password < 4 characters" do
expect{ model = FactoryGirl.create(:user, :password => "12", :password_confirmation => "12") }.to raise_error
end
it "cannot update to password < 4 characters" do
model = FactoryGirl.create(:user)
model.should be_valid
model.update_attributes({:password => "12", :password_confirmation => "12"})
model.reload
model.password.should_not eq("12")
end
但是,第二次测试失败了。出于某种原因,“12”似乎可以作为有效密码保存到数据库中。为什么? API声明update_attributes
不应绕过任何验证!
答案 0 :(得分:3)
我认为它不会跳过验证。
我怀疑这个:
model.update_attributes({:password => "12", :password_confirmation => "12"})
返回false。密码可能不是数据库中的一列,而是你可能有crypted_password和password_salt,所以重新加载它不会从数据库中读取密码(这会很糟糕)
另外,您可能想要:
attr_accessible :password, :password_confirmation