Проверка контроллера не пройдена для аутентификации пользователя rails - PullRequest
0 голосов
/ 14 июля 2009

- предисловие: игнорируйте, если хотите.
Я новичок в rails и работаю над проектом, который потребует аутентификации пользователя. Я нашел этот учебник и пытался пройти через него и понять, что происходит. Конечно, это не совсем то, что мне нужно, как есть, так что я изменяюсь по мере продвижения вперед. Учебник также устарел в некоторых областях, поэтому, конечно, мне пришлось обновить мой код. Так что часть моей проблемы в том, что я не уверен, что ошибка в моих модификациях, или какая-то функция, которая устарела, или что.

- вопрос
Это (самый простой) тест, который не проходит. («Ожидается, что не будет ноль» в первом утверждении assert.)

def test_authentication
  #check we can log in
  post :login, :user => { :username => "bob", :password => "test" }
  assert_not_nil session[:user_id]
  assert_equal users(:bob).id, session[:user_id]
  assert_response :redirect
  assert_redirected_to :action => 'welcome'
end

Вызывает логин действия user_controller:

def login
  if request.post?
    if session[:user_id] = User.authenticate(params[:user][:username], params[:user][:password])
    flash[:message] = "Login succeeded!"
    redirect_to_stored
    else
      flash[:warning] = "Login failed."
    end
  end
end

, который вызывает метод User для аутентификации. Однако я знаю, что аутентификация работает правильно, потому что у меня есть один тест, который проходит:

def test_registration
  #check that we can register and are logged in automatically
  post :register, :user => { :username => "newuser", :password => "pass", :password_confirmation => "pass", :email => "newuser@web.com" }
  assert_response :redirect
  assert_not_nil session[:user_id]
  assert_redirected_to :action => 'welcome'
end

, который вызывает регистр действий user_controller

def register
  @user = User.new(params[:user])
  if request.post?
    if @user.save
      session[:user_id] = User.authenticate(@user.username, @user.password)
      flash[:message] = "Registration succeeded"
      redirect_to :action => 'welcome'
    end
  else
    flash[:warning] = "Registration failed"
  end
end

, который успешно вызывает аутентификацию.

пользовательский прибор имеет одну соответствующую запись:

bob:
  username: bob
  email: bob@mcbob.com 
  hashed_password: 77a0d943cdbace52716a9ef9fae12e45e2788d39 # test
  salt: 1000

Я проверил хешированный пароль и соль - "test" - правильный пароль.

Итак, по моему анализу, ошибка должна быть в одном из 3 мест:
как я отправляю свой почтовый запрос,
как я получаю доступ к параметрам в действии входа в систему,
или какой-то аспект загрузки прибора.

(первоначально я использовал код учебника для явной загрузки прибора (self.use_instantiated_fixtures = true; fixtures: users), но я прочитал, что все приборы автоматически загружаются перед тестированием, поэтому я его вынул. изменить вещь.)

Конечно, поскольку я не могу найти проблему в этих областях, она может быть точно так же и где-либо еще.

1 Ответ

1 голос
/ 15 июля 2009

Возможно ли, что есть фильтр, который предотвращает вызов вашего действия? Если есть общий :before_filter => 'login_required', то, возможно, вы вообще не достигаете своей функции входа в систему. (Хотя по общему признанию действие регистра должно было быть исключено для того, чтобы этот тест прошел)

В подобных случаях полезно придерживаться некоторого входа в систему (или проходить через отладчик), чтобы увидеть, попадете ли вы даже в ту часть метода, которая, по вашему мнению, дает сбой. Если бы это был я, я бы вставил logger.debug("...") в качестве первой строки метода входа в систему, затем еще одну после проверки для request.post?, а затем еще одну после проверки подлинности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...