我在mocha测试套件中使用setTimeout在描述块中进行it()的最后一次调用之前插入一个20秒的延迟。虽然,我正在使用done(),但我仍然在终端上得到以下错误:
错误:超过2000毫秒的超时。对于异步测试和挂钩,确保调用“done()”;如果返回一个promise,请确保它解决错误:超过2000ms的超时。对于异步测试和挂钩,确保调用“done()”;如果返回一个承诺,确保它解决
我做错了什么?
以下是我的代码:
describe('Testing get and post APIs', ()=> {
it('Series of get and post', (done) => {
chai.request(server)
.post('/thisis/1st_post')
.send()
.end((err, res) => {
expect(res.statusCode).to.equal(200);
chai.request(server)
.get('/thisis/1st_get')
.send()
.end((err, res) => {
expect(res.statusCode).to.equal(200);
setTimeout(function() {
chai.request(server)
.post('/thisis/last_post')
.send()
.end((err, res) => {
expect(res.statusCode).to.equal(200);
done();
})
},20000);
});
});
});
});
感谢。
答案 0 :(得分:0)
如果您希望测试运行程序等待的时间超过默认时间,则需要更改超时值。例如,尝试将其添加到describe
块的开头:
this.timeout(30 * 1000); // wait up to 30 seconds before failing from timeout
另请参阅:https://docs.microsoft.com/en-us/windows/desktop/winprog/using-the-windows-headers和Change default timeout for mocha
但是,根据所需的20秒延迟的原因,延长测试超时时间可能是错误的解决方案。如果您仅使用延迟来处理请求承诺永远无法解决的情况,那么更好的方法是使用https://mochajs.org/api/test#timeout。如果不了解您的情况,我还是很难判断。
答案 1 :(得分:0)
超时设置为20000 (20 seconds)
,但基于错误的测试超时为2000 (2 seconds)
。这意味着我们需要为测试本身设置更大的超时时间。
describe('Testing get and post APIs', function() { // don't use () because we want to use `this` in the next line
this.timeout(40000); // set timeout here
it('Series of get and post', function(done) {
chai.request(server)
.post('/thisis/1st_post')
.send()
.end((err, res) => {
expect(res.statusCode).to.equal(200);
chai.request(server)
.get('/thisis/1st_get')
.send()
.end((err, res) => {
expect(res.statusCode).to.equal(200);
setTimeout(function () {
chai.request(server)
.post('/thisis/last_post')
.send()
.end((err, res) => {
expect(res.statusCode).to.equal(200);
done();
})
}, 20000);
});
});
});
});
我想知道我们是否可以像下面那样进行测试。它更干净,更易于维护。
describe('Testing get and post APIs', function () { // don't use () because we want to use `this` in the next line
this.timeout(40000); // set timeout here
it('Series post', function () { // no need done() because we can just return promise
return chai.request(server)
.post('/thisis/1st_post')
.send()
.end((err, res) => {
expect(res.statusCode).to.equal(200);
})
});
it('Series get', function () {
return chai.request(server)
.get('/thisis/1st_get')
.send()
.end((err, res) => {
expect(res.statusCode).to.equal(200);
});
});
it('Series last post', function(done) {
setTimeout(function () {
chai.request(server)
.post('/thisis/last_post')
.send()
.end((err, res) => {
expect(res.statusCode).to.equal(200);
done();
});
}, 20000);
});
});
希望有帮助。