Testing Mocha/supertest/expect MEAN-stack HTTP Request 4 seconds delay done
我正在使用Mocha / supertest / expect库在MEAN-Stack中测试HTTP请求,该过程需要4秒钟才能返回:
1 2 3 4 5 6 7 8 9
| it('should return product data', (done) => {
request(app)
.get('/P/Product')
.expect(200)
.expect((res) => {
expect(res.body[0]._id).toEqual('123456789')
})
.end(done);
}); |
HTTP请求完成后,该函数应在最后执行"完成"回调。 但是我得到了错误:
1 2 3
| 1) should return product data:
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure"done()" is called; if returning a
Promise, ensure it resolves. |
我认为它适用于未嵌套的预期呼叫。 像上面的示例一样,我该如何在其他期望调用中嵌套期望调用呢?
可能来自请求的响应时间太长,导致Mocha的默认2秒测试超时发生。 可能尝试从CLI到URL的cURL,以查看您返回或提高测试的Mocha测试时间阈值的时间。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| describe('testing', function() {
// This applies the timeout of 5 seconds to each test.
this.timeout(5000);
it('should return product data', function() {
// This applies a timeout of 5 seconds for this test only
this.timeout(5000);
request(app)
.get('/P/Product')
.expect(200)
.expect((res) => {
expect(res.body[0]._id).toEqual('123456789')
})
.end(done);
});
}); |
如果您认为expect调用链导致超时问题,则可以使用诺言方法。
1 2 3 4 5 6 7 8
| it('should return product data', () => {
request(app)
.get('/P/Product')
.then((res) => {
expect(res.status).to.equal(200);
expect(res.body[0]._id).to.equal('123456789');
})
}); |
-
嗯,能给我一个例子,如何设置摩卡测试时间阈值? beforeEach(function(done){this.timeout(3000); setTimeout(done,3000);这不起作用...
-
我编辑了答案,提供了如何在套件级别或单个测试级别使用设置超时的示例
-
嘿,感谢您的示例,我在代码中尝试了相同的操作,但是得到了:TypeError:this.timeout不是一个函数...我用它搜索了一下,似乎其他许多人也遇到了相同的问题,这个?如果您运行带有timout选项的摩卡,它实际上在全局范围内起作用:" mocha --timeout 15000",但不适用于测试单元级别...
-
奇怪的是,当我希望它超过2秒时,这对我自己的测试有效。根据mocha文档,这也是超时处理的方法
-
嗯,我的行为很怪异……可能会链接" .timeout(2000)",并且它没有抱怨,但是,这似乎不是问题所在。实际上,它正在等待导致问题的" DB连接处于活动状态" ...建立连接显然花费了很长时间,以至于在建立任何连接之前,来自测试运行的异步请求已经从数据库调用了数据...因此超时没有影响,请求本身花费了大约50ms。但是,我在一个请求中使用了> 2000ms的超时,但是仍然无法解决如何接受超过2000ms的超时...
-
还有一个问题..在使用this.timout()之前,您是否使用了任何导入?
-
不。 this是作为Mocha一部分的测试或测试套件的引用
-
您可能在describe上使用了箭头功能,这就是为什么未定义this.timeout的原因。使用describe(title, function() {...}代替describe(title,() => {...}
-
@Nicholas Kyriakides,您实际上是正确的,我使用了正常的回调函数:它(应该异步平方一个数字,函数(完成){this.timeout(2005); utils.asyncSquare(5,(res)=> {期望(res ).toBe(25).toBeA(number); done();});});它与超时一起工作...
我得到了解决方案,问题是使用箭头功能:(done)=>{...},而不是正常的回调,它的工作方式如下:
1 2 3 4 5 6 7
| it('should async square a number', function(done) {
this.timeout(2005);
utils.asyncSquare(5, (res) => {
expect(res).toBe(25).toBeA('number');
done();
});
}); |
或者,如果您在打包测试脚本中全局设置超时,它也可以使用:
1
| "test":"mocha --timeout 3000 **/*.test.js", |
-
它的@AndrewNolan回答了问题的症结(使用.timeout),因此ID建议您删除答案并接受他的回答。您使用箭头功能的事实与您最初遇到的问题是相切的。
-
@AndrewNolan的解决方案不能像他展示的那样工作,您需要在it函数内部使用一个正常的回调函数(完成),但要感谢...
-
没问题,我为那些拒绝别人所做的工作来帮助他的人再次高兴地做这件事,因为他不知道如何使用箭头功能。
-
嗯,您实际上是对的,我再次对其进行了测试,然后它起作用了。我从最上层的右括号把描述错了,这就是问题。对此表示抱歉,没有理由不礼貌,老兄;)
-
您在这里错过了重点。 @AndrewNolan告诉您您以前不知道的timeout。那就是答案。如何使timeout工作与该问题有关。如果您认为他的答案可以改善,请对其进行编辑,但仍然可以接受。没有人会因为帮助您解决问题而获得报酬,至少您能做的就是表明您通过适当地授予声誉来赞赏自己的努力。
-
如果不起作用,我怎么知道它的正确答案?我应该接受不正确的答案,还是只接受不知道其正确性的任何答案?你的答案没有道理...
-
好的,所以根据我在安德鲁斯评论下的建议,您使它成功了。所以您知道这是超时。尽管如此,您还是遵循了这一事实,并根据与安德鲁完全相同的建议写了自己的答案。现在你累了我。如果您仍然没有得到我要向您指出的内容,那么请搁置我的情况,这将是我的最后评论。
-
我不明白为什么你这么大惊小怪,我的目的不是偷东西。 学分,我只是想从本质上理解这个主题,起初它与我的Andrews解决方案不兼容,然后我发现自己有错别字,但由于数据库的行为不一致,现在我什至不 在第一次启动时(或在唤醒睡眠后?),对于任何请求,我的数据库总是需要超过2秒的初始时间,在重试测试后,它不到50毫秒...但是除此之外,在这里,这确实是一件令人讨厌的事情,许多 ppl对"愚蠢"的问题很粗鲁...
-
...并且禁止用户似乎只是时间问题