Rspec Factory вопрос - концептуальная проблема? - PullRequest
2 голосов
/ 01 июня 2011

Я пытаюсь проверить случай в нашей системе 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

1 Ответ

0 голосов
/ 01 июня 2011

Я бы порекомендовал вам либо установить 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
...