Ошибка: превышено время ожидания 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 где-нибудь в этом примере кода, так что я бы сказал, что есть одна из двух возможных проблем.

  1. E сть beforeAll метод с проблемой где-то не в этом примере кода.
  2. 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();
  });

});

Надеюсь, поможет!

Другие вопросы по тегам