摩卡超时后承诺解决
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');
}
});
});
我有一个正在使用 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');
}
});
});