尽管使用done()进行异步调用,如何摆脱mocha-chai测试中的超时错误?

时间:2018-03-11 17:59:58

标签: mocha settimeout chai

我在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);  
               }); 
             });     
        });
});

感谢。

2 个答案:

答案 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-headersChange 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);
  });
});

希望有帮助。