2016-10-31 175 views
0

我有一個摩卡測試,當我在調試模式下運行它,但在運行模式下失敗(我使用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) 

    }); 
}) 

我的猜測是,摩卡會卡在某個地方紡紗,所以回調事件沒有機會得到EXEC但在調試模式下,它以某種方式被觸發。

問題:

  1. 是我的猜想是否正確?
  2. 我怎麼能找到摩卡的旋轉代碼?我使用--prof選項運行摩卡,並使用chrome chrome://tracing加載分析,但我不知道如何找到該地點。附

是V8日誌文件log

回答

0

摩卡不旋轉,它等待對被稱爲done()回調。

看起來你的隊列或閱讀器有問題。當您將閱讀器附加到空隊列或消息到達之前,message事件可能不會觸發?在調試中加入或添加延遲將允許它連接到已經填充的隊列。

您應該能夠在產生readermessage事件的任何事件中設置一個斷點,以查看是否在兩種情況下都觸發。

+0

事件沒有被解僱,但在調試模式下它被解僱了。即使閱讀器連接時隊列爲空,後面的發送消息也應該觸發客戶端。 – Jerrylk

0

我找到了原因:

如果只nsqlookupd提供的nsq.js閱讀客戶端將輪詢nsqlookupd服務器每隔20秒內找到可用的nsqd

,所以當讀取客戶端連接,沒有nsqd當前指定的主題在寫入客戶端向nsqd服務器發送消息後,讀取客戶端的消息處理程序應在20秒後觸發,因此mocha超時。

在調試模式

,測試運行很慢有20秒鐘過去了,讀者會去再次lookupd的服務器,並找到指定的消息更新nsqd服務器......在運行模式

相關問題