2016-10-31 2 views
0

Ich habe einen Mokka-Test, der erfolgreich ist, wenn ich es im Debug-Modus ausführen, aber im Ausführungsmodus fehlschlägt (ich verwende WebStorm).Mocha-Test im Lauf fehlgeschlagen, aber im Debug-Modus erfolgreich

, was ich in dem Test gemacht habe, ist:

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

im Run-Modus, ist es immer Timeout, was bedeutet, dass der Lese-Rückruf nicht ausgelöst wurde, aber im Debug-Modus es gelingt ...

Wenn ich das in einem Timeout empfangen Code planen, wird es im Run-Modus gelingen:

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) 

    }); 
}) 

Meine Vermutung ist, dass Mokka in einem Ort Spinnen stecken wird, so dass die Callback-Ereignis hat keine Chance exec zu bekommen , aber im Debug-Modus wird es irgendwie ausgelöst.

Fragen:

  1. ist meine Vermutung richtig?
  2. wie könnte ich den Spinncode in Mokka finden? Ich habe Mokka mit - Prof-Option ausgeführt, und verwenden Sie Chrom chrome://tracing, um das Profiling zu laden, aber ich habe keine Ahnung, wie Sie den Ort finden.

angebracht ist der V8-Protokolldatei log

Antwort

0

Mocha nicht anläuft, ist es warten, bis die done() Rückruf aufgerufen werden.

Es scheint, dass Sie ein Problem mit Ihrer Warteschlange oder Ihrem Reader haben. Vielleicht löst das Ereignis message nicht aus, wenn Sie ein Lesegerät an eine leere Warteschlange anhängen oder bevor eine Nachricht eintrifft? Beim Debugging oder Hinzufügen der Verzögerung würde es eine Verbindung zu einer bereits gefüllten Warteschlange herstellen.

Sie sollten in der Lage sein, einen Breakpoint auf das Ereignis readermessage zu setzen, um zu sehen, ob/wann es in beiden Szenarien ausgelöst wird.

+0

im Run-Modus findet das Ereignis nicht gefeuert wurde , aber im Debug-Modus hat es ausgelöst. Selbst wenn die Warteschlange beim Verbinden des Lesers leer ist, sollte die letztere Nachricht die Client-Seite auslösen. – Jerrylk

0

Ich habe die Ursache gefunden:

wenn nur nsqlookupd zur Verfügung gestellt, die nsq.js Client lesen alle 20 Sekunden, um den nsqlookupd Server finden nsqd verfügbar abfragt, wenn so die Lese Client eine Verbindung herstellen, gibt es keine nsqd Wenn der Schreibclient eine Nachricht an den nsqd-Server sendet, sollte der Nachrichtenhandler des Leseclients 20 Sekunden später ausgelöst werden, so dass das Mocha-Zeitlimit überschritten wird.

im Debug-Modus läuft der Test so langsam, dass 20 Sekunden vergangen, und der Leser wird gehen Server erneut lookupd und die aktualisierte nsqd Server mit angegebener Meldung ...

Verwandte Themen