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版本,甚至在必要时使用操作系统)。