2016-06-20 3 views
1

Ich habe den folgenden Code:Ist es möglich, lokale Variable in angularjs Fabrik von Karma zu verspotten?

'use strict'; 

angular 
    .module('testmodule') 
    .factory('TestService', ['$q', '$timeout', 
     function ($q, $timeout) { 

var timeoutRetries = 0; // brauchen diese

  var api = new TestApi(); 

      function getResults(id, prevDeferred) { 
       var deferred = prevDeferred || $q.defer(); 

       function handleSuccessResponse(data) { 
        if (data.status === 'ready') { 
         results.put(id, data); 
         deferred.resolve(data); 
        } else {       

von hier zu verspotten if (++ timeoutRetries> 30) {// Es wird nicht in hier

      handleErrorResponse(); 
         } else { 
          $timeout(function() { 
           getResults(id, deferred); 
          }, 2000); 
         } 
        } 
       } 

       function handleErrorResponse(response) { 
        deferred.reject(response); 
       } 

       if (results.get(id)) { 
        deferred.resolve(doSomething.get(id)); 
        return deferred.promise; 
       } 

       api.get({id: id}).then(handleSuccessResponse, handleErrorResponse); 
       return deferred.promise; 
      } 

      return { 
       getResults: getResults 
      }; 
     }]); 

Ich bin versuchen, den timeoutRetries-Eintrag aus Karma zu verspotten, aber ich bin nicht in der Lage, es zu tun. Ist es der ideale Weg, um es zu deklarieren oder sollte ich die Variable in eine Funktion verschieben und aktualisieren wollen oder was ist der beste Weg, um es von Karma nachzuahmen?

Versucht mit inject, erklärte die Variable vor dem Aufruf der Funktion. Immer noch kein Erfolg.

+0

Mögliche Betrogene von http://stackoverflow.com/questions/9619500/using-jasmine-to-spy-on-variables-in-a -Funktion –

+0

@MuthukannanKanniappan - Ich denke, Sie haben meine Frage falsch verstanden, die Verbindung, die Sie zur Verfügung gestellt ergibt in Funktion, wo ich in der Fabrik schaue. Ähnliche Frage: http://stackoverflow.com/questions/26938842/how-doi-i-mock-local-variable-for-a-function-in-a-service-jasmine-karma-tests. Aber ich bin immer noch auf der Suche nach einer guten Antwort. – Mithun

Antwort

1

Sie müssen diesen Zweig so abdecken, dass er die lokale Variable automatisch abdeckt. Sieht so aus, als würde Ihr Test dieses Szenario nicht abdecken.

Sie sind abhängig von Statusdaten aus den Ergebnissen .. Wenn es fertig ist, geben Sie Ergebnisse zurück. Wenn nicht Inkrement-Timeout und wenn> 30 ist, dann Fehlermeldung sonst Umfrage für die Ergebnisse erneut, bis entweder Sie den Status erhalten Fertig oder Timeout ist 30.

Sie können anderen Zweig leicht abdecken.

var isReadyTrue = false; 
$httpBackend.expectGET(url).respond(function() { 
      return [201, function(){ 
if (isReadyTrue) { 
results.data = 'Ready'; 
} else { 
results.data = 'Not Ready'; 
} 
isReadyTrue = true; // Next result will be ready.. 

return results; 
}]; 
     }); 

Wir können lokale Variable nicht vortäuschen, aber wir können Szenario überspielen, um das zu bedecken.

Das erste Ergebnis ist nicht Ready, daher wird Timeout 1 sein und für die Abfrage gehen. Das nächste Ergebnis kehrt mit Ready Data zurück.

Sie für Timeout verspotten 30 Kombination mit von oben und $ timeout

Verwandte Themen