Rspec Factory问题 - 概念问题?

时间:2011-06-01 17:09:54

标签: ruby-on-rails factory-bot rspec-rails

我正在尝试在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认识到这是有效的用户,但帐户应该被锁定。有人可以帮助我直截了当吗?下面是整个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

1 个答案:

答案 0 :(得分: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

或使用存根来存根locked_login?或等效方法:

before(:each) do
  @user = Factory(:user)
  @user.stub(:locked_login?).and_return(true)
  @attr = { :email => @user.email, :password => @user.password}
end