承诺在摩卡超时后解决

时间:2017-05-15 07:42:05

标签: javascript mocha chai es6-promise web-worker

我有一名工作人员正在使用Mocha进行测试,但即使我从承诺解析中得到了正确的响应,Mocha也会因超时而导致测试失败。关键的事实是它在摩卡超时后解决了。

import chai, { expect } from 'chai';
// Needed otherwise Worker is undefined in the test environment
const Worker = require('webworker-threads').Worker;

describe('WebWorker', () => {
  it('should return correctly', () => {
    return new Promise(res => {
      const dummyWorker = new Worker('./public/js/worker.bundle.js');

      dummyWorker.onmessage = e => {
        console.log('test message'); // 'test message' prints to testing log
        res(e.data);
      };

      dummyWorker.postMessage(['foo', 'bar']);
    })
    .then(workerData => {
      console.log(workerData[0]); // 'foo' prints to testing log
      expect(workerData[0]).to.equal('foo');
    })  
    .catch(err => console.error(err));
  });
});
  

错误:超出2000毫秒超时。对于异步测试和挂钩,请确保" done()"叫做;如果返回Promise,请确保它已解决。

我已尝试使用done()使用before()使用this.timeout(5000)钩子,使用承诺和Mocha的使用chai-as-promised的每个的一些排列完成后,使用<head> <meta name="viewport" content="width=device-width, initial-scale=1"> </head>增加超时,然后打开,但似乎没有任何效果。

1 个答案:

答案 0 :(得分:1)

我已将问题缩小到npm包webworker-threads。你知道什么它实际上是一个尚未解决的issue

涉及承诺时,这只是一个问题。我以为我尝试在done()内使用dummyWorker.onmessage,但遗憾的是我错了。使用done()和webworker-threads工作得很好。然而,使用done()的问题是任何断言错误只会返回超时消息。使用promises,错误消息更加具体。

因此,我已经切换到使用不同的Web工作包 - 小工作者,现在它工作得很好。

如果您想查看webworker-threads的问题,请参阅下面的简单示例,该示例在不需要外部文件的情况下重现错误:

import { expect } from 'chai';
const Worker = require('webworker-threads').Worker;

describe('web worker', () => {
  it('should resolve', () => {
    const p = new Promise(resolve => {
      const dummyWorker = new Worker(function () {
        this.onmessage = e => {
          self.postMessage('foo');
        };
      });

      dummyWorker.onmessage = e => {
        resolve(e.data);
      };
      dummyWorker.postMessage('foo');
    });

    return p.then(data => {
      console.log(data));
      expect(data).to.equal('bar');
    }
  });
});