【发布时间】: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