我有一名工作人员正在使用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>
增加超时,然后打开,但似乎没有任何效果。
答案 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');
}
});
});