Управление ошибкой в ​​пользовательском шаге для автоматического входа в CodeceptJS

Я использую плагин autoLogin в CodeceptJS с Puppeteer в качестве тестовой библиотеки.

Это мой первый проект с CodeceptJS, рабочий процесс autoLogin работает нормально, но я не использую страницы приложения (UI) для входа в систему или проверки текущего токена, я использую прямые вызовы REST API, чтобы немного облегчить весь процесс. Быстрее.

Моя конфигурация autoLogin выглядит примерно так:


autoLogin: {
      enabled: true,
      saveToFile: true,
      inject: 'login',
      users: {
        admin: {
          login: async (I) => {
            I.amOnPage('/login');
            await I.loginWithCredentials(adminUser.username, adminUser.password);            
          },
          check: (I) => {
            const token = codeceptjs.store['admin_session'];
            I.validateToken(token);
          },
          fetch: async (I) => {
            const cookie = await I.grabCookie('token');
            return cookie.value;
          },
          restore: (I, sessionToken) => {
            I.amOnPage('/login');
            I.saveTokenData(sessionToken);
          }
        },
     }
   }

Шаги saveTokenData(), validateToken() и loginWithCredentials() - это настраиваемые шаги, определенные с помощью actor(), например:

module.exports = function() {
  return actor({

    async validateToken(token) {
    
      let response = await this.sendGetRequest(`/api/session/validate?token=${token}`);
      
      if (response.status === 200) {
        if (response.data === true) {
          return true;
        }
      }
      throw new Error('Invalid token !!');
    }
});

Строка throw new Error('Invalid token !!'); Она генерирует непредвиденную ошибку в рабочем процессе, показывая эту строку в журнале:

(node:5986) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)

Я пробовал несколько подходов, таких как использование recorder.add() (выдача ошибки внутри рекордера), я также пытался использовать цепочки обещаний (без ключевого слова async) и assert lib с assert.fail(), но всегда та же проблема.

Как я могу пометить свой пользовательский шаг как сбой без странных сообщений журнала? Я просто хочу реализовать шаг check в autoLogin без выходящего API для проверки пользовательского интерфейса (I.see(), I.seeElement(), _16 _...)

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

check: async (I) => {
  console.log('admin.check');
  const token = codeceptjs.store['admin_session'];
  const isValid = await I.validateToken(token);
  if (!isValid) {
    I.see("NOTHING TO SEE HERE, so It'll fail");
  }
},

Я открыл проблему в проекте CodeceptJS GitHub # 2600


person Roberto    schedule 20.09.2020    source источник


Ответы (1)


Как насчет использования метода assert.fail? Это приведет к сбою всего вашего сценария, и вы можете настроить сообщение!

const assert = require("assert");

module.exports = function() {
  return actor({

    async validateToken(token) {
    
      let response = await this.sendGetRequest("/api/session/validate?token=${token}");
      
      if (response.status !== 200 || response.data !== true) {
         assert.fail("Invalid token!");
      }
       
    }
});

Метод проверки:

check: async (I) => {
  console.log('admin.check');
  const token = codeceptjs.store['admin_session'];
  await I.validateToken(token);
}
person Klein    schedule 28.09.2020
comment
assert.fail() вызывает ту же проблему. Он прерывает весь рабочий процесс autoLogin. - person Roberto; 28.09.2020