【问题标题】:How to test setTimeout with Mocha如何使用 Mocha 测试 setTimeout
【发布时间】:2014-04-09 14:53:04
【问题描述】:

我正在我的 Node 应用程序中进行一些集成测试,并在我的代码中的某个位置调用以下函数:

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

我尝试了什么: 显然,在测试过程中时钟被禁用了,所以我尝试使用诗乃来模拟时间的流逝,但无济于事。

我该如何解决这个问题?

【问题讨论】:

  • 那么,function(err, res)回调函数根本没有执行?
  • 是的。它挂在 setTimeout() 处。如果我删除超时,代码执行得很好。
  • 你在这里使用什么请求模块?
  • 我使用了旧的 console.log 来确定它是否到达那里并且它没有工作。这是我尝试的第一件事。我想不通,所以我只是更改了我的异步库,这样我就不必使用 setTimeout 了,现在我没事了。这个问题还是很奇怪。
  • @GeorgeEracleous 如果有一个可以重现问题的虚拟项目会非常好,这样我们就可以单独尝试(使用相同的依赖项、node.js 版本,甚至必要时使用操作系统)。

标签: node.js mocha.js


【解决方案1】:

好吧,我今天遇到了类似的问题。 我使用的是var clock = sinon.useFakeTimers(),没有clock.restore()

要尝试,您可以使用:

console.log(new Date().getTime());
console.log(new Date().getTime());

如果你得到两次相同的值,这意味着你可能已经改变了时钟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 2018-08-26
    • 2013-02-10
    • 2020-11-13
    • 1970-01-01
    • 2012-05-26
    相关资源
    最近更新 更多