Node.js 如何使用Mocha测试setTimeout
我正在我的节点应用程序中进行一些集成测试,在我的代码中,我调用了以下函数:Node.js 如何使用Mocha测试setTimeout,node.js,mocha.js,Node.js,Mocha.js,我正在我的节点应用程序中进行一些集成测试,在我的代码中,我调用了以下函数: async.parallel([ function foo(callback){ setTimeout(function(){ //DO SOMETHING HERE; callback(null, result); }, 500); }, function bar(callback){
async.parallel([
function foo(callback){
setTimeout(function(){
//DO SOMETHING HERE;
callback(null, result);
}, 500);
},
function bar(callback){
//DO SOMETHING HERE;
callback(null, result);
}],
function(err, results){
//Process results here and continue
});
此代码是大型节点应用程序的一部分
现在,当我尝试使用Mocha测试代码时,测试会挂起,因为foo()中的超时永远不会触发,因此并行执行永远不会完成。当我删除setTimeout时,执行就完成得很好
以下是测试代码:
it("test something", function(done) {
request(app)
.post(requestUrl)
.send(testRequest)
.expect(200)
.end(function(err, res){
(res.body.text).should.equal('Hello World');
done();
});
});
我的尝试:
显然,时钟在测试过程中被解除了锁定,所以我尝试使用Sinon模拟时间的流逝,但没有效果
我怎样才能解决这个问题呢?我今天也遇到了类似的问题。 我使用的是
var clock=sinon.useFakeTimers()
而不是clock.restore()
要尝试这一点,您可以使用:
console.log(new Date().getTime());
console.log(new Date().getTime());
如果得到相同值的两倍,则意味着您可能已更改了时钟。因此,
函数(err,res)
回调函数根本不执行?是的。它在setTimeout()处挂起。如果我删除超时,代码就可以正常执行。您在这里使用的是什么请求模块?我使用了旧的console.log来确定它是否到达了那里,但没有工作。这是我尝试的第一件事。我无法理解它,所以我只是更改了我的异步库,这样我就不必使用setTimeout,现在我没事了。这个问题仍然很奇怪。@GeorgeEracleous如果有一个复制这个问题的虚拟项目,那就太好了,这样我们就可以单独尝试(使用相同的依赖项、node.js版本,甚至在必要时使用操作系统)。