首页 文章

承诺在摩卡超时后解决

提问于
浏览
0

我有一个我正在测试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));
  });
});

错误:超出2000ms的超时 . 对于异步测试和钩子,确保调用“done()”;如果返回Promise,请确保它已解决 .

我已经尝试了使用 done() 的每一些排列,使用 before() 钩子,使用chai-as-promised,使用promises和Mocha完成,使用 this.timeout(5000) 来增加超时,然后开启,但似乎没有任何效果 .

1 回答

  • 1

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

    当涉及承诺时,这只是一个问题 . 我以为我尝试在 dummyWorker.onmessage 中使用 done() ,但我遗憾地错了 . 使用 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');
        }
      });
    });
    

相关问题