Ошибка: превышено время ожидания 30000 мс. Для асинхронных тестов и хуков убедитесь, что вызывается "done()"; если возвращаете обещание, убедитесь, что оно разрешается
Я пытаюсь написать тесты для электрона, используя спектрон.
Это мой код
describe ('Application launch', function(done) {
this.timeout(30000);
const app = new Application({
path: electronBinary,
args: [baseDir],
});
before(() => app.start());
after(() => app.stop());
it('shows an initial window', async () => {
await app.client.waitUntilWindowLoaded();
const count = await app.client.getwindowcount();
assert.equal(count,1);
});
});
Тем не менее, когда я бегу npm test
Я получаю ошибку
1) Application launch "before all" hook:
Error: Timeout of 30000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
2) Application launch "after all" hook:
Error: Application not running
at Application.stop (node_modules\spectron\lib\application.js:58:48)
at Context.after (test\spec.js:19:19)
Нужно ли добавлять какие-либо функции к существующим хукам?
2 ответа
Похоже, что происходит в вашем before all
метод. Обратите внимание, что ваша ошибка говорит 1) Application launch "before all" hook:
,
Так что ваша реальная тестовая функция выглядит хорошо для меня. И я не вижу beforeAll
где-нибудь в этом примере кода, так что я бы сказал, что есть одна из двух возможных проблем.
- E сть
beforeAll
метод с проблемой где-то не в этом примере кода. before
Показанный здесь хук возвращает объект без обещаний.
В вашем коде вы используете лямбда-функцию, чтобы сделать работу раньше, но если app.start()
возвращает объект, который не является обещанием, то это будет вашей проблемой. Попробуйте рефакторинг это больше так:
before(() => {
app.start()
})
Если твой app.start()
функция асинхронна, вам может понадобиться передать обработчик done в нее:
before((done) => {
app.start(done)
})
Или, возможно, конвертировать ваши app.start()
функция, чтобы вернуть обещание, которое должно разрешить его. Вам может понадобиться добавить async () => app.start()
но я не думаю, что это было бы необходимо для такого выражения.
Вы не использовали "done" в качестве обратного вызова в своей it-функции. Вам также не нужно использовать готовый в описанном обратном вызове. Кроме того, поскольку done() уже делает ваш код асинхронным, вам не нужно использовать ключевое слово async. Мое решение:
describe ('Application launch', function() {
this.timeout(30000);
const app = new Application({
path: electronBinary,
args: [baseDir],
});
before(() => app.start());
after(() => app.stop());
it('shows an initial window', (done) => {
await app.client.waitUntilWindowLoaded();
const count = app.client.getwindowcount();
assert.equal(count,1);
done();
});
});
Надеюсь, поможет!