2016-04-28 103 views
3

在这里,我附上了我的代码,我正在通过完成回调并使用超级请求。因为我在使用request.end中的测试用例中使用断言/期望为什么我需要担心超时?我在这里犯了什么错误。如何避免摩卡测试用例超时?

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(); 
     }); 
}); 

测试结果如下响应: 错误:超过2000ms的超时。确保在此测试中正在调用done()回调。

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

+0

可能重复[更改默认超时为摩卡](http://stackoverflow.com/questions/23492043/change-default-timeout-for-mocha) – Louis

回答

3

If I am running my testcases with mocha command then its show this error while If I am running test mocha --timeout 15000 then testcase is passing correctly. But I want to avoid timeout, How can I do that?

不能避免超时,因为它看起来像您正在测试远程服务。如果由于某种原因,对该服务的请求需要很长时间,那么超时。

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

作为替代方案,你可以模拟request(我假定是superagent),这样就可以控制整个HTTP请求/响应流,但由于它看起来像你测试远程服务(一个,你必须没有控制),这将使这个特定的测试案例没有意义。

+0

好吧,但如果我不能避免超时,那么我将如何知道应该保留多少超时,每当我写一个测试用例时,我都无法进行命中和试用,并且还取决于网络速度。那么测试这些服务的任何通用方法? –

+0

您可以做的唯一事情是设置超时的上限(如5分钟),或者完全禁用它们。但是由于你基本上正在测试一个外部服务,所以没有通用的解决方案来避免超时。 – robertklep

+0

我还有一个疑问是,因为我们在request.end()中使用了期望(也传递完成回调)的断言,所以这意味着完成回调应该在得到响应后传递。不是吗?我指的是以下部分代码。 (err,res){//为什么需要超时 if(err)return done(err); console.log(JSON.stringify(res.body)); expect(res.body。 )状态).to.deep.equal('SUCCESS'); done(); }); –

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); 
    }); 
}) 
1

在摩卡2秒(2000ms)默认的超时默认设置。

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

如果您希望改变特定测试用例的超时时间,可以使用this.timeout(xxxx)函数(其中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秒通常是运行测试,所以我要说的是,扩展默认的超时时间应该是一个例外,而不是在公共规则的好长的时间你试验。 另外,如果您的测试不是异步的,而且您必须延长超时时间,我强烈建议您查看延长超时前需要很长时间的功能。

+0

伟大的答案和明智的建议 - “所以我会说扩大默认超时应该是一个例外,而不是测试中的通用规则“。令人失望的是一年前的答案,没有投票。是否有*真的*在愤怒中测试他们的东西,还是我们还在踢轮胎? – jmc