В Cypress перед тестом установите токен в localStorage

Я хочу войти в систему и установить токен localStorage на клиенте (в частности, jwt)

Как я могу сделать это с помощью cy.request, как это предлагается в документации Cypress?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
45
0
37 511
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Вот пример добавления команды cy.login(), которую вы можете использовать в любом тесте Cypress или вставить в ловушку beforeEach.

Cypress.Commands.add('login', () => { 
  cy.request({
    method: 'POST',
    url: 'http://localhost:3000/api/users/login',
    body: {
      user: {
        email: '[email protected]',
        password: 'jakejake',
      }
    }
  })
  .then((resp) => {
    window.localStorage.setItem('jwt', resp.body.user.token)
  })

})

Тогда в вашем тесте:

beforeEach(() => {
  cy.login()
})

Это работает, но значение перезаписывается, когда я посещаю URL-адрес приложения. Мое приложение не может прочитать созданное локальное хранилище.

otong 13.03.2019 03:06

Вам необходимо перейти на свою страницу, прежде чем устанавливать localStorage.

bkucera 13.03.2019 03:12

Я потратил на это так много часов и, наконец, могу с уверенностью заключить, что это никогда не будет работать для запросов OAuth.

Это может работать для локального сервера, но не когда вы получаете токен для аутентификации.

Lol xD - нет ничего невозможного

FooBar 25.09.2020 19:39

Вы можете сделать запрос на получение требуемых данных у поставщика OAuth.

Johnnes Souza 02.06.2021 03:05

В качестве дополнения вы также можете использовать пакет cypress-localstorage-команды для сохранения localStorage между тестами, поэтому запрос на вход будет выполнен только один раз:

В support / commands.js:

import "cypress-localstorage-commands";

Cypress.Commands.add('login', () => { 
  cy.request({
    method: 'POST',
    url: 'http://localhost:3000/api/users/login',
    body: {
      user: {
        email: '[email protected]',
        password: 'jakejake',
      }
    }
  })
  .its('body')
  .then(body => {
    cy.setLocalStorage("jwt", body.user.token);
  })
});

Затем в ваших тестах:

before(() => {
  cy.login();
  cy.saveLocalStorage();
});

beforeEach(() => {
  cy.restoreLocalStorage();
});

Работал только у меня с указанным вами пакетом. Спасибо

Mauricio Moraes 18.03.2020 02:09

Согласно документации по npm, вы должны очистить хранилище на before(), затем в beforeEach выполнить восстановление и посетить, затем afterEach сохранить локальное хранилище. Note the usage of beforeEach and afterEach for preserving localStorage between all tests. Also clearLocalStorageSnapshot is used in the before statement to avoid possible conflicts with other test files preserving localStorage.

dragon788 26.08.2020 23:38

Я уже некоторое время использовал что-то вроде ответа bkuceras. Недавно я столкнулся с проблемой при тестировании нескольких ролей / логинов во время тестов. В основном происходит то, что я вхожу в систему как администратор и провожу один тест, затем я вхожу в систему как не администратор и провожу второй тест. Первый тест проходит нормально и завершается (cypress очищает локальное хранилище), однако при запуске второго теста все еще выполняются некоторые xhr-запросы. Эти запросы xhr больше не видят токен, который запускает мое приложение, чтобы увидеть несанкционированную ошибку 401 и очистить локальное хранилище (включая мой токен, не являющийся администратором, который я установил). Теперь второй тест не проходит, потому что этот токен без администратора недоступен в локальном хранилище.

В конечном итоге мое решение заключалось в том, чтобы предварительно получить токен перед тестом, а затем установить токен в функции onBeforeLoad посещения. Это гарантирует, что токен не будет очищен каким-либо условием гонки до вашей команды посещения.

cy.visit('/app', {
    onBeforeLoad: function (window) {
        window.localStorage.setItem('token', myToken);
    }
})

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

Я думаю, что название этой темы следует обновить. Токен JWT является основным предметом обсуждения!

Главный вопрос касался токена JWT, но в целом все современные приложения используют OIDC Статья Microsoft - v2-протоколы-oidc / АДАЛ, и здесь очень сложная ситуация, чтобы получить доступ, просто генерируя токены с помощью вызова API. Я нашел здесь, который и проверим это с помощью моего приложения. Но будьте уверены, что вы хорошо разбираетесь в JS и получаете хорошую помощь от вашей DevTeam;)

Другие вопросы по теме