我试图在Ruby on Rails系统中测试一个案例,在x次登录失败后,我们将用户锁定在外。我遇到的问题是试图创建一个用户,该用户已达到"锁定"其帐户的号码。我正在使用工厂创建一个像这样的用户-
Factory.define :locked_user, :class => User do |user|
user.name "Test Lock"
user.email "lock@lock.com"
user.password "blah1234"
user.password_confirmation "blah1234"
user.login_count 5
end
其中5是"幻数"。当我尝试使用类似的东西时
@user = Factory(:locked_user)
它在数据库中创建一个用户,但新创建的用户总是将login_count设置为零,所以它只将他记录在测试中。当我尝试像那样的.build方法时
@user = Factory.build(:locked_user)
它设置了一个login_count=5的用户,就像我想要的那样,但它不认为该用户有效,也不会尝试让他们登录(即,它给我们的错误是"坏用户/密码",而不是"正确用户/密码,但你被锁定了")。我想我错过了一些东西,让RSpec了解这是一个有效的用户,但帐户应该被锁定。有人能帮我澄清一下吗?以下是整个描述块-
describe "with locked account" do
before(:each) do
@user = Factory.build(:locked_user)
@attr = { :email => @user.email, :password => @user.password}
end
it "should not allow signin with locked account" do
post :create, :session => @attr
flash.now[:error].should =~ /Invalid user locked out/i
end
end
我建议您在创建用户后设置login_count,或者在用户登录被锁定时存根告诉您的方法。
例如,在创建用户后使用update_attribute强制login_count:
before(:each) do
@user = Factory(:user)
@user.update_attribute(:login_count, 5)
@attr = { :email => @user.email, :password => @user.password}
end
或者使用存根来截断locked_login?,或等效方法:
before(:each) do
@user = Factory(:user)
@user.stub(:locked_login?).and_return(true)
@attr = { :email => @user.email, :password => @user.password}
end