Mocha测试在运行中失败,但在调试模式下成功

时间:2016-10-31 07:15:41

标签: node.js mocha webstorm v8

我的mocha测试在调试模式下运行时成功,但在运行模式下失败(我使用WebStorm)。

我在测试中所做的是:

it("test messenger", function(done){
    messenger.send(message, callback); 
    //the messenger will save messages temporarily
    //and send them to outside message queue(nsq) every 1 second (using setInterval)

    reader.connect(nsq)... ; 

    reader.on('message', function(message){
        //validate message ...
        done();
    });
})

在运行模式下,它总是超时,这意味着没有触发读回调,但在调试模式下它成功...

如果我在超时时安排接收代码,它将在运行模式下成功:

it("test messenger", function(done){
    messenger.send(message, callback); 
    //the messenger will save messages temporarily
    //and send them to outside message queue(nsq) every second (using setInterval)
    setTimeout(function(){
        reader.connect(nsq)
        reader.on('message', function(message){
        //validate message ...
        done();
    }, 1000)

    });
})

我的猜测是mocha会卡在某个地方旋转,所以回调事件没有机会被执行,但是在调试模式下,它会被触发。

问题:

  1. 我猜是正确的吗?
  2. 我怎么能在摩卡中找到旋转代码?我使用--prof选项运行mocha,并使用chrome chrome://tracing加载分析,但我不知道如何找到该地点。
  3. 附件是V8日志文件log

2 个答案:

答案 0 :(得分:0)

Mocha不会旋转,它等待调用done()回调。

您的队列或读者似乎有问题。将读卡器连接到空队列或消息到达之前,message事件可能不会触发?逐步调试或添加延迟将允许它连接到已填充的队列。

您应该能够在生成reader message事件的任何内容上设置一个断点,以查看它是否/何时在两种情况下都会触发。

答案 1 :(得分:0)

我找到了原因:

如果只提供nsqlookupd,nsq.js读取客户端将每20秒轮询一次nsqlookupd服务器以查找可用的nsqd,因此当读取客户端连接时,当前没有指定主题的nsqd,写入客户端发送消息后nsqd服务器,读取客户端的消息处理程序应在20秒后触发,因此mocha超时。

在调试模式下,测试运行速度太慢,经过20秒,读者将再次进入查找服务器并找到已更新的nsqd服务器并指定消息...