【问题标题】:Promise resolves after Mocha times outMocha 超时后 Promise 解决
【发布时间】:2017-10-13 21:48:38
【问题描述】:

我有一个工人正在用 Mocha 进行测试,但即使我从承诺解决方案中得到了正确的响应,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()钩子、使用chai-as-promised、使用promises AND Mocha's done、使用this.timeout(5000)来增加超时, 等等,但似乎没有任何效果。

【问题讨论】:

  • 您应该延长 mocha 的超时时间。将it 箭头函数重写为常规函数并添加为第一行this.timeout(5000)。这将使 Mocha 至少等待 5 秒钟再抱怨。
  • @MarcoL 嘿,谢谢你的建议。我实际上也尝试过,但忘记将其包含在我尝试过的事情列表中。我现在会更新列表。
  • 你正在返回一个 Promise,所以 Mocha 应该正确地等待它解决。这强烈表明从未调用过dummyWorker.onmessage(...)。你能发布./public/js/worker.bundle.js在做什么吗?
  • @PeterWagener 您好,感谢您的帮助,但它不能是工作人员,因为正在从承诺解决中返回 workerData。如果我要添加一个故意失败的测试断言expect(workerData[0]).to.equal('baz'),它将在屏幕上打印出发生了 AssertionError。有趣的是 Mocha 并没有解析它自己的 AssertionError 而是简单地通过 console.error(err) 返回它。 Mocha 返回的错误仍然是超时超出消息。是的,我尝试过使用变体 .catch(err => done(err)).catch(done)
  • 你能用代码创建一个 plunkr/jsfiddle 吗?

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


【解决方案1】:

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

只有在涉及承诺时才会出现问题。我以为我尝试在dummyWorker.onmessage 中使用done(),但很遗憾我错了。将 done() 与 webworker-threads 一起使用就可以了。然而,使用done() 的问题是任何断言错误只会返回超时消息。使用 Promise,错误消息更加具体。

因此,我改用了不同的 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');
    }
  });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 2023-03-17
    • 2023-03-16
    相关资源
    最近更新 更多