#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()
выдает ту же проблему, она прерывает весь рабочий процесс автозапуска