【问题标题】:Rspec Factory issue- conceptual problem?Rspec 工厂问题 - 概念问题?
【发布时间】:2011-06-01 17:09:53
【问题描述】:

我正在尝试在我们的 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

【问题讨论】:

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


    【解决方案1】:

    我建议您在创建用户后设置 login_count,或者存根告诉您用户登录是否被锁定的方法。

    例如,在创建用户后使用 update_attribute 强制登录计数:

    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
    

    【讨论】:

    • 我尝试使用 .update_attribute 方法(考虑到我们计划的实施,这更有意义)但它仍然认为 last_login 值是 0 即使在我给它新值之后也是如此。有什么想法吗?
    • 这是一个实现错误。您可能有一些 after_save 或 before_save 钩子覆盖该值并将其设置为 0。我建议在继续进行其余测试之前调试该单独的 update_attribute 行 - 编写一些单元测试并首先解决该问题。
    猜你喜欢
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 2011-07-31
    • 1970-01-01
    相关资源
    最近更新 更多