2016-04-28 7 views
3

Hier füge ich meinen Code an, ich übergebe Rückruf und verwende Supertest für Anfrage. Da ich Assert/Expect in meinem Testcase in request.end Block verwende, warum muss ich mich über Timeout Sorgen machen? Was ist der Fehler, den ich hier mache?Wie vermeiden Sie Zeitüberschreitungen in Mocha-Testfällen?

it('should get battle results ', function(done) { 
    request(url) 
     .post('/compare?vf_id='+vf_id) 
     .set('access_token',access_token) 
     .send(battleInstance) 
     .end(function(err, res){ // why need timeout 
     if (err) return done(err); 
     console.log(JSON.stringify(res.body)); 
     expect(res.body.status).to.deep.equal('SUCCESS'); 
     done(); 
     }); 
}); 

Testfall Ergebnisse folgende Antwort: Fehler: Timeout von 2000 ms überschritten. Stellen Sie sicher, dass der Rückruf done() in diesem Test aufgerufen wird.

Wenn ich meine Testfälle mit Mokka-Befehl ausführen, dann zeigt es diesen Fehler, während Wenn Test mocha --timeout 15000 ausgeführt wird, wird Testfall korrekt übergeben. Aber ich möchte Timeout vermeiden, wie kann ich das tun? Hier

+0

Mögliche Duplikate von [Standard-Timeout für Mocha ändern] (http://StackOverflow.com/Questions/23492043/change-default-Timeout-for-Mocha) – Louis

Antwort

3

If I am running my testcases with mocha command then its show this error while If I am running test mocha --timeout 15000 then testcase is passing correctly. But I want to avoid timeout, How can I do that?

Sie können nicht Timeouts vermeiden, da es so aussieht, sind Sie ein Remote-Service zu testen. Wenn aus irgendeinem Grund die Anfrage an diesen Dienst lange dauert, werden Sie in Timeouts laufen.

Sie können Mocha anweisen, die Timeout-Prüfung zu deaktivieren, indem Sie das Timeout auf 0 setzen, aber das ist wahrscheinlich auch nicht ideal, da dies dazu führen kann, dass jeder Testfall übermäßig lange dauert.

Als Alternative können Sie verspotten request (was ich davon ausgehen, ist superagent), so können Sie den gesamten HTTP-Request/Response-Fluss steuern, aber da es sieht aus wie Sie eine Remote Service zu test (eine, die Sie haben keine Kontrolle über), die diesen Testfall erschweren würde.

+0

Okay, aber wenn ich Timeouts nicht vermeiden kann, dann weiß ich, wie lange ich warten muss, ich kann nicht jedes Mal, wenn ich einen Testfall schreibe, einen Hit und einen Test machen, und das hängt auch von der Netzwerkgeschwindigkeit ab. Also jeder generische Ansatz, um diese Dienste zu testen? –

+0

Das einzige, was Sie tun können, ist eine obere Grenze für das Timeout (wie 5 Minuten), oder deaktivieren Sie sie insgesamt. Aber da Sie im Grunde einen externen Dienst testen, gibt es keine allgemeine Lösung für Zeitüberschreitungen. – robertklep

+0

Ein weiterer Zweifel, den ich habe, ist, dass, da wir in request.end() Assertion wie expect (und auch done callback passing) verwenden, also bedeutet done callback sollte nach dem Erhalten der Antwort übergeben werden. nicht wahr? Ich beziehe mich auf den folgenden Teil des Codes. .end (function (err, res) {// warum brauchen Timeout if (err) Rückkehr getan (err); console.log (JSON.stringify (res.body)); erwarten (res.body. status) .to.deep.equal ('SUCCESS'); done(); }); –

0

ist, was Sie

mocha timeouts

describe('a suite of tests', function() { 
    this.timeout(500); 

    it('should take less than 500ms', function(done){ 
    setTimeout(done, 300); 
    }); 

    it('should take less than 500ms as well', function(done){ 
    setTimeout(done, 250); 
    }); 
}) 
1

In Mokka ein Standard-Timeout von 2 Sekunden benötigen (2000ms) standardmäßig eingestellt ist.

Sie können das standardmäßige (globale) Zeitlimit über die Befehlszeile mithilfe des Flags --timeout xxxx erweitern.

Wenn Sie stattdessen das Zeitlimit für einen bestimmten Testfall ändern möchten, können Sie die Funktion this.timeout(xxxx) verwenden (xxxx ist eine Zahl wie 20000, die Millisekunden darstellt).

describe("My suite", function(){ 
    // this will apply for both "it" tests 
    this.timeout(5000); 

    it("Test 1", function(){ 
    ... 
    }); 

    it("Test 2", function(){ 
    ... 
    }); 

}); 

Es funktioniert auch für before, beforeEach, after, afterEach Blöcke:

it('My test', function(){ 
    this.timeout(5000); 
    //... rest of your code 
}); 

Sie können auch ein Timeout von einer Reihe von Testfällen (von einem describe verpackt) eingestellt.

Weitere Dokumentation finden Sie hier: https://mochajs.org/#timeouts

Bedenken Sie, dass 2 Sekunden ist in der Regel eine gute Zeit, Ihre Tests laufen, damit ich, dass erweitern die Standard-Timeout sagen würde, sollte eine Ausnahme sein, nicht die allgemeine Regel in Ihrem Tests. Auch wenn Ihr Test nicht asynchron ist und Sie das Zeitlimit verlängern müssen, würde ich dringend empfehlen, die Funktion zu überprüfen, die so lange dauert, bis das Zeitlimit verlängert wird.

+0

Große Antwort und weise Ratschläge - "so würde ich sagen, dass erweitern Das Standard-Timeout sollte eine Ausnahme sein, nicht die allgemeine Regel in Ihren Tests ". Enttäuschend, antwortete vor über einem Jahr und keine Abstimmung. Prüft jemand * wirklich * ihr Zeug im Zorn oder treten wir immer noch die Reifen? – jmc