2013-10-21 5 views
28

Ich liebe Verwendung Konsolenprotokoll für Feedback vielleicht zu viel, und manchmal ich in Code, dass als Konvention haben wir hinzugefügt $ Timeout in der Direktive/Service/Controller, manchmal so lange als 500 ms, und jetzt ist das Problem während des Komponententests, bemerkte ich nur console.logs direkt unter dem es Konstruktor wird an Karma gesendet und auf dem Bildschirm ausgegeben.Wie funktioniert Timeout in Winkel Tests im Karma ausgeführt

eingewickelte Konsolenprotokolle unter Timeout oder eher umschlossene Assertions unter $ timeout ergeben kein Ergebnis, als ob ignoriert, was ist die Lösung für Timeouts?

Antwort

88

In Ihren Komponententests laden Sie ngMock, die das Orignal $timeout mit seinem Schein überschreibt. Mock $timeout funktioniert nicht wie das echte JavaScript timeout. Um den darin enthaltenen Code aufzurufen, müssen Sie $timeout.flush() von Ihrem Komponententest aus tun.

Wenn $timeout funktioniert wie die echte timeout, müssten Sie asynchrone Komponententests für alle Funktionen schreiben, die $timeout verwenden.

Hier ist ein Beispiel für eine vereinfachte Funktion, die $timeout verwendet und wie ich es testen:

gaApi.getReport = function() { 
    report = $q.defer() 

    $timeout(function() { 
    $http({method: 'GET', url: 'https://www.googleapis.com/analytics/v3/data/ga'}) 
     .success(function(body) { 
     report.resolve(body) 
     }) 
    }, 300) 

    return report.promise 
} 

Ein Unit-Test:

describe('getReport', function() { 
    it('should return report data from Google Analytics', function() { 
    gaApi.getReport().then(function(body) { 
     expect(body.kind).toBe('analytics#gaData') 
    }) 

    $timeout.flush() 
    $httpBackend.flush() 
    }) 
}) 
+6

IMHO das Eckige Team ist richtig, dass Schreiben asynchrone Tests saugt. 'flush()' FTW. – weltschmerz

+1

Ich stieß auf einen Artikel, der $ timeout.flush am Anfang des Tests verwendet, anstatt danach. Was ist der Unterschied in diesem Ansatz? http://jasonwatmore.com/post/2015/03/06/AngularJS-Unit-Testing-code-that-uses-$timeout.aspx – Winnemucca

Verwandte Themen