错误:超时超过30000ms。对于异步测试和挂钩,请确保调用了“ done()”;如果返回承诺,请确保其解决

时间:2019-01-21 12:55:54

标签: javascript electron spectron

我正在尝试使用光谱仪编写电子测试。

这是我的代码。

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 个答案:

答案 0 :(得分:0)

您没有在it函数中使用“ done”作为回调。您也不必在describe回调中使用done。另外,由于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();
  });

});

希望有帮助!

答案 1 :(得分:0)

您的before all方法中似乎正在发生这种情况。请注意,您的错误提示为1) Application launch "before all" hook:

所以您的实际测试功能对我来说还不错。而且在此示例代码中的任何地方都看不到beforeAll,所以我会说存在两个可能的问题之一。

  1. 存在一个beforeAll方法,该问题不在此代码示例中。
  2. 此处显示的before钩子返回一个非承诺对象。

在您的代码中,您正在使用lambda函数完成之前的工作,但是如果app.start()返回的对象不是promise,那将是您的问题。尝试像这样重构它:

before(() => {
  app.start()
})

如果您的app.start()函数是异步的,则可能需要将完成的处理程序传递给它:

before((done) => {
  app.start(done)
})

或者可能将您的app.start()函数转换为返回可以解决它的promise。您可能需要添加async () => app.start(),但是对于这样的单个表达式,我认为这不是必需的。