2016-01-28 3 views
0

В учебном пособии Rails Chapter 8 проверяется, что флажок «Запомнить меня» работает.Доступ к виртуальному токену в тестах

В реальном соревновании, если пользователь проверяет флажок «Запомнить меня» на странице входа, после логина создать действие контроллера сеансов использует remember(user) помощника, который создает remember_token для пользователя и обновление атрибута remember_digest в модели пользователя (через метод remember в user.rb), затем устанавливает cookies[:user_id] = user.id и cookies[:remember_token] = user.remember_token.

В книге говорится, что в тесте «В идеале мы бы отметили, что значение cookie равно знаку запоминания пользователя, но поскольку в настоящее время не существует способа, чтобы тест мог получить к нему доступ: пользовательская переменная в контроллер имеет атрибут токена, но (поскольку remember_token является виртуальным) переменная @user в тесте не ".

тест определен ниже:

def setup 
    @user = users(:michael) 
end 

test "login with remembering" do 
    log_in_as(@user, remember_me: '1') 
    assert_not_nil cookies['remember_token'] 
end 

Прежде всего, учитывая, как cookies['remember_token'] определяется (cookies[:remember_token] = user.remember_token), если это правда, что мы не можем получить доступ к помните атрибут маркера, я задаюсь вопросом, как мы можем проверить, что cookies['remember_token'] - это не ноль.

Несмотря на то, что приборы не определяют какой-либо запоминающий токен для пользователя michael, метод тестового помощника log_in_as определяется для отправки правильных значений login_path для параметров [: session], поэтому мне интересно: не эти значения приняты создать действие контроллера сеансов? Если это так, то действие create должно выполнить ту же работу, что описано выше для реального конкурса: помощник remember(user) создаст для пользователя remember_token, и мы можем проверить, cookies['remember_token'] = user.remember_token.

Я не понимаю, почему мы не сможем получить доступ user.remember_token.

ответ

1

@user создан через светильник. Проблема заключается в том, что #remember_token является виртуальным атрибутом, что означает, что он не сопоставляется с столбцом базы данных. Он устанавливается только тогда, когда функция #remember вызывается на экземпляр User, и когда этот экземпляр умирает, он умирает с ним (хотя дайджест его сохраняется в базе данных, а зашифрованная версия сохраняется в куки пользователя) ,

Что вы там делаете с помощью #log_in_as является то, что, во-первых вы создаете User, а затем в #log_in_as вы берете, что адрес электронной почты пользователя и пароль, и отправить его в контроллер. Контроллер обнаруживает, что пользователь из базы данных использует предоставленное вами электронное письмо и продолжает работу и вызывает функцию #remember в этом экземпляре.

Как вы можете видеть, функция никогда не вызывалась на ваш экземпляр @user, поэтому он так и не получил remember_token. Но через это действие контроллера устанавливается cookie, и в базе данных сохраняется дайджест. Итак, что вы тестируете, нужно проверить, установлен ли файл cookie или нет.

Если вы хотите быть более тщательным, я думаю, что еще одна вещь, которую вы можете сделать, - проверить, является ли дайджест файла cookie таким же, как дайджест в базе данных.

+0

Так что, если это правильно, вызов «токен пользователя.remember» не имеет смысла, когда пользователь из инвентаря, но имеет смысл, когда с помощью назначений (: пользователь) мы получаем доступ к @user (и @ user.remeber_token) внутри создать действие контроллера. – Asarluhi

+1

'@ user', созданный с помощью прибора, а' user' в контроллере являются отдельными экземплярами 'User', хотя их представление в базе данных одинаково. Когда вызывается 'user.remember', он создает токен и сохраняет его в этом виртуальном атрибуте. Когда контроллер выполнен, экземпляр 'user' и виртуальный атрибут в нем гибнут вместе. Затем вы вернетесь к своему тесту, и у вас все еще есть экземпляр '@ user'. Но у этого никогда не было виртуального атрибута 'remember_token', поэтому вы не можете получить к нему доступ, так как это« nil ». – hattenn

Смежные вопросы