В учебном пособии 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
.
Так что, если это правильно, вызов «токен пользователя.remember» не имеет смысла, когда пользователь из инвентаря, но имеет смысл, когда с помощью назначений (: пользователь) мы получаем доступ к @user (и @ user.remeber_token) внутри создать действие контроллера. – Asarluhi
'@ user', созданный с помощью прибора, а' user' в контроллере являются отдельными экземплярами 'User', хотя их представление в базе данных одинаково. Когда вызывается 'user.remember', он создает токен и сохраняет его в этом виртуальном атрибуте. Когда контроллер выполнен, экземпляр 'user' и виртуальный атрибут в нем гибнут вместе. Затем вы вернетесь к своему тесту, и у вас все еще есть экземпляр '@ user'. Но у этого никогда не было виртуального атрибута 'remember_token', поэтому вы не можете получить к нему доступ, так как это« nil ». – hattenn