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

#javascript #puppeteer #e2e-testing #codeceptjs

#javascript #кукловод #e2e-тестирование #codeceptjs

Вопрос:

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

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

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

 
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 библиотеку с assert.fail() , но всегда одна и та же проблема.

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

Я использую уродливый обходной путь, пока не получу лучшее решение, пользовательский шаг возвращает логическое значение без каких-либо ошибок, и в 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 project # 2600

Ответ №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);
}
  

Комментарии:

1. assert.fail() выдает ту же проблему, она прерывает весь рабочий процесс автозапуска