如何避免摩卡测试用例超时?

时间:2016-04-28 06:54:37

标签: node.js unit-testing mocha supertest

这里我附加了我的代码,我正在完成回调并使用supertest进行请求。因为我在request.end块中的testcase中使用assert / expect,为什么我需要担心超时?我在这里犯的是什么错误。

it('should get battle results ', function(done) {
    request(url)
      .post('/compare?vf_id='+vf_id)
      .set('access_token',access_token)
      .send(battleInstance)
      .end(function(err, res){  // why need timeout
        if (err) return done(err);
        console.log(JSON.stringify(res.body));
        expect(res.body.status).to.deep.equal('SUCCESS');
        done();
      });
 });

响应后的测试用例结果:      错误:超过2000毫秒的超时。确保在此测试中调用done()回调。

如果我使用mocha命令运行我的测试用例,那么它显示此错误,而如果我正在运行测试mocha --timeout 15000,则testcase正确传递。但我想避免超时,我该怎么做?

4 个答案:

答案 0 :(得分:8)

  

如果我使用mocha命令运行我的测试用例,那么它显示此错误,而如果我正在运行测试mocha --timeout 15000,则testcase正确传递。但我想避免超时,我该怎么做?

您无法避免超时,因为您似乎正在测试远程服务。如果由于某种原因,对该服务的请求需要很长时间,那么 会遇到超时。

您可以通过将超时设置为0来告诉Mocha禁用超时检查,但这可能也不理想,因为它可能会导致每个测试用例花费过多的时间。

作为替代方案,您可以模拟request(我假设为superagent),这样您就可以控制整个HTTP请求/响应流,但是因为它看起来像您正在测试远程服务(你无法控制的服务)会使这个特定的测试用例无法实现。

答案 1 :(得分:2)

在mocha中,默认设置默认超时为2秒(2000ms)。

您可以使用--timeout xxxx标志从命令行扩展默认(全局)超时。

如果您希望更改特定测试用例的超时,可以使用this.timeout( xxxx )功能 - 请注意,它不适用于arrow functions - (其中xxxx是一个类似的数字代表毫秒的20000

it('My test', function(){
  this.timeout(5000);
  //... rest of your code
});

您还可以设置一组测试用例的超时(由describe包裹):

describe("My suite", function(){
  // this will apply for both "it" tests
  this.timeout(5000);

  it( "Test 1", function(){
     ...
  });

  it( "Test 2", function(){
     ...
  });

});

它也适用于beforebeforeEachafterafterEach块。

此处提供了更多文档:https://mochajs.org/#timeouts

考虑2秒通常是运行测试的大量时间,所以我会说扩展默认超时应该是一个例外,而不是测试中的常见规则。 此外,如果您的测试不是异步并且您必须延长超时,我强烈建议您在延长超时之前查看花费这么长时间的功能。

答案 2 :(得分:0)

这是你需要的

mocha timeouts

describe('a suite of tests', function() {
  this.timeout(500);

  it('should take less than 500ms', function(done){
    setTimeout(done, 300);
  });

  it('should take less than 500ms as well', function(done){
    setTimeout(done, 250);
  });
})

答案 3 :(得分:0)

Mocha : Timeouts

特定于测试的超时也可以应用,或者使用this.timeout(0)一起禁用超时:

要禁用超时,只需将其设置为 0 。调试时使用mocha <file> --timeout 0,所以不会引发超时错误。