2

我正在尝试在我们的 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 的用户,但随后不认为该用户有效并且不会尝试登录(即,它给了我们“错误的用户/密码”错误而不是“正确的用户” /password 但你被锁定了'错误)。我想我在这里遗漏了一些东西来让 RSpec 了解这是一个有效用户但该帐户应该被锁定的事实。有人可以帮我纠正一下吗?下面是整个desribe块-

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
4

1 回答 1

0

我建议您在创建用户后设置 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

或者使用存根来存根 lock_login?,或者等效的方法:

before(:each) do
  @user = Factory(:user)
  @user.stub(:locked_login?).and_return(true)
  @attr = { :email => @user.email, :password => @user.password}
end
于 2011-06-01T17:17:12.743 回答