我的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会卡在某个地方旋转,所以回调事件没有机会被执行,但是在调试模式下,它会被触发。
问题:
chrome://tracing
加载分析,但我不知道如何找到该地点。附件是V8日志文件log
答案 0 :(得分:0)
Mocha不会旋转,它等待调用done()
回调。
您的队列或读者似乎有问题。将读卡器连接到空队列或消息到达之前,message
事件可能不会触发?逐步调试或添加延迟将允许它连接到已填充的队列。
您应该能够在生成reader
message
事件的任何内容上设置一个断点,以查看它是否/何时在两种情况下都会触发。
答案 1 :(得分:0)
我找到了原因:
如果只提供nsqlookupd,nsq.js读取客户端将每20秒轮询一次nsqlookupd服务器以查找可用的nsqd,因此当读取客户端连接时,当前没有指定主题的nsqd,写入客户端发送消息后nsqd服务器,读取客户端的消息处理程序应在20秒后触发,因此mocha超时。
在调试模式下,测试运行速度太慢,经过20秒,读者将再次进入查找服务器并找到已更新的nsqd服务器并指定消息...