摩卡超时后承诺解决

Promise resolves after Mocha times out

我有一个正在使用 Mocha 进行测试的工作人员,但即使我从 promise 解析中得到了正确的响应,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));
  });
});

Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

我尝试了 一些使用done()、使用before() 钩子、使用 chai-as-promised、使用 promises 和 Mocha 的一些排列组合,使用 this.timeout(5000) 来增加超时,等等,但似乎没有任何效果。

我已将问题缩小到 npm 包 webworker-threads。你知道什么。其实是一个还没解决的issue

只有在涉及到 promise 时才会出现问题。我以为我尝试在 dummyWorker.onmessage 中使用 done(),但我错了。将 done() 与 webworker-threads 一起使用效果很好。然而,使用 done() 的问题是任何断言错误只会 returns 超时消息。有了 promises,错误消息就更具体了。

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

如果您想查看 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');
    }
  });
});