Попробуйте изменить fail("SETUP FAILED:\n"+e)
вызов на console.log("SETUP FAILED:\n"+e)
и сообщите нам, что он регистрирует.
У меня возникла та же проблема, что и при воспроизведении вашей проблемы, потому что я забыл, например, команду require('puppeteer')
...
Некоторые дополнительные соображения:
вам не нужен вызов done()
, функция beforeAll
является асинхронной, и вы ждете каждый вызов Puppeteer, так что... функция завершается сама собой без необходимости вызова done()
.Удалите его даже из переданных параметров
, который вы называете fail
, но где он определен?
- удалите большой
try/catch
вокруг всего, тестВ случае ошибки автоматически происходит сбой с полезной информацией, дополнительное окружение try/catch
не приносит вам никаких преимуществ и делает ваши тесты более подробными
Дайте мне знать, если это полезно ?
ОБНОВЛЕНИЕ
В комментариях еще один вопрос об этом
о, и где я могу найти документы, которые beforeAll ожидает завершения асинхронной функции?
Ну, я начинаю с самого начала:
Функция beforeAll - это просто обычная функция JS
beforeAll(() => {
// do your sync stuff
}
, так что если вы делаете некоторую асинхронностьвещи внутри него
beforeAll(() => {
setTimeout(() => {
// ...
}, 1000);
}
он не может знать, что он должен чего-то ждать, поэтому вы можете использовать функцию done
beforeAll((done) => {
setTimeout(() => {
done();
}, 1000);
}
, поэтому Jest не учитывает это"готово", пока вы не вызовете саму функцию done
вручную.Те же значения для обещания
beforeAll((done) => {
yourFunctionThatReturnsAPromise(() => {
done();
});
}
или некоторого объединения обещаний
beforeAll((done) => {
yourFunctionThatReturnsAPromise(() => {
return anotherPromise();
}).then(() => {
return anotherPromise();
}).then(() => {
done();
});
}
, и мы можем сократить его еще
beforeAll((done) => {
yourFunctionThatReturnsAPromise(() => anotherPromise())
.then(() => anotherPromise())
.then(() => done());
}
Async / Await async/await
добавлено для лучшего управления цепочками обещаний, давайте посмотрим, как мы можем преобразовать последнюю функцию
beforeAll(async (done) => {
await yourFunctionThatReturnsAPromise())
await anotherPromise();
done();
}
- мы
await
каждое обещание - мы добавляем
async
функции, переданной в beforeAll
При этом каждое обещание автоматически ожидает, и мы сообщаем JS, что наша функция асинхронная, и она автоматически ожидает завершения обещания, прежде чем считать нашу функцию завершенной.И поскольку он ожидает автоматически ... теперь мы можем удалить done
use
beforeAll(() => {
await yourFunctionThatReturnsAPromise())
await anotherPromise();
}
Теперь мы можем применить это к вашему сценарию: помните, что почти каждая функция Puppeteer возвращает обещание, чтобы мы могли написать установкуиспользуйте такую функцию
beforeAll((done) => {
puppeteer.launch({
headless: false,
slowMo: 20,
args: [`--window-size=${width},${height}`]
}).then(browser => {
return browser.newPage();
}).then(page => {
return page.setViewport({ width, height });
}).then(() => {
done();
})
}
и преобразуйте ее в исходную
beforeAll(async (done) => {
browser = await puppeteer.launch({
headless: false,
slowMo: 20,
args: [`--window-size=${width},${height}`]
})
page = await browser.newPage()
await page.setViewport({ width, height })
done()
}
, но поскольку это асинхронная функция, и вы await
все вызовы Кукловода вы можете удалить done
function
beforeAll(async () => {
browser = await puppeteer.launch({
headless: false,
slowMo: 20,
args: [`--window-size=${width},${height}`]
})
page = await browser.newPage()
await page.setViewport({ width, height })
}
, поскольку автоматически ожидается функция async
, она не заканчивается без ожидания разрешения обещаний (тех, которые вы await
явно).