Как войти в систему и выйти из системы перед запуском тестов - PullRequest
1 голос
/ 02 августа 2020

В Cypress пытаюсь что-то протестировать в бэкэнде. Я действительно изо всех сил пытаюсь контролировать, вошел ли пользователь в систему или нет.

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

Я ищу команду, которая делает это:

  1. Выход любого пользователя (если он находится в системе) при запуске любого теста.
  2. Быстрый способ сделать что-то вроде: cy.loginUser( 'foo@example.org', 'password' )?

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

Он используется в приложении Laravel / Vue (отсюда и CSRF-токен).

Моя текущая попытка:

Cypress.Commands.add( "loginUser", ( email, password ) => {
  cy.server();
  
  // Source: https://github.com/cypress-io/cypress/issues/413
  sessionStorage.clear();
  cy.clearCookies();
  cy.clearLocalStorage();
  cy.window().then((win) => {
  win.sessionStorage.clear()
  });
  
  cy.visit( Cypress.env( 'baseUrl' ) + "/login");
  
  cy.location().should((loc) => {
    expect(loc.pathname).to.eq('/login')
  });
  
  cy.get("head meta[name=csrf-token]")
    .then((meta) => {
    const csrf = meta[0].content;
  
    cy.request({
      method: 'POST',
      url: '/login',
      body: {
        _token: csrf,
        email: email,
        password: password
      }
    });
  });
  
  cy.visit( Cypress.env( 'baseUrl' ) + "/login");
});

Проблемы с этим:

  • По какой-то странной причине ... Каждый второй раз пользователь остается в системе с предыдущего сеанса. Но если это произойдет, мне просто придется запустить его снова, и тогда пользователь выйдет из системы. Это сводит меня с ума.
  • Это не медленно, но и не быстро (учитывая, что я делаю это бесчисленное количество раз). Так что, если бы это можно было сделать быстрее (с меньшим количеством загрузок страниц), это было бы потрясающе.

1 Ответ

0 голосов
/ 03 августа 2020

Попробуйте использовать другой способ очистки localStorage. Например, я использую эти команды для сохранения, восстановления и очистки хранилища и отлично работает. Я использую их для входа / выхода.

let LOCAL_STORAGE_MEMORY = {};

Cypress.Commands.add("saveLocalStorage", () => {
  Object.keys(localStorage).forEach(key => {
    LOCAL_STORAGE_MEMORY[key] = localStorage[key];
  });
});

Cypress.Commands.add("restoreLocalStorage", () => {
  Object.keys(LOCAL_STORAGE_MEMORY).forEach(key => {
    localStorage.setItem(key, LOCAL_STORAGE_MEMORY[key]);
  });
});

Cypress.Commands.add("clearLocalStorageCache", () => {
  localStorage.clear();
  LOCAL_STORAGE_MEMORY = {};
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...