2017-12-17 4 views
0

Ich muss einige Code in Angular mit Jasmine testen, aber die Sache ist, dass ich dies wegen $ Timeout-Aufruf nicht tun kann. So sieht der Code wie folgt aus:Testen von JS Callback mit Timeout mit Jasmine

$scope.add = function() { 
    SomeService.add(id, function() { 
     $timeout(function() { 
      $scope.showSuccessMessage(); 
     }, 1000) 
    }, function() {}) 
}; 

So ist der Testcode ist:

describe('method add', function() { 
    it('should add', function() { 
     spyOn(SomeService, 'add').and.callFake(function(id, successCallback, errorCallback) { 
      spyOn(scope, 'showSuccessMessage'); 
      successCallback(); 
      expect(scope.showSuccessMessage).toHaveBeenCalled(); 
     }); 
     scope.add(); 
     expect(SomeService.add).toHaveBeenCalled(); 
    }); 
}); 

Und das Problem ist, dass wegen der Timeout Anruf, den ich nicht, dass showSuccessMessage überprüfen() aufgerufen wurde. Ich weiß, dass Jasmine mit Timeouts arbeiten kann, aber in diesem Fall kann ich keinen funktionierenden Weg finden, weil ich es im Callback anrufe. Deshalb brauche ich Hilfe. Vielen Dank.

+0

setzen konnte man unter 'setTimeout' setzen erwarten, funktioniert es für mich :) – Nemani

Antwort

1

Im nicht sehr vertraut mit der Funktionsweise des Winkels, ich hoffe, das hilft:

Sie die getan Funktion für asynchronen Code verwenden können:

 


    it('should add', function (done) { 
     $scope.successCallback = function() { 
      // successCallback was called 
      done(); 
     } 

     $scope.add(); 
    }); 

 
+0

AngularJS ngMock Modul wurde entwickelt, synchron zu schaffen, Tests in Jasmin. 'done' wird niemals zum Testen von reinem Winkelcode benötigt. – estus

2

Sie Ihre Timeout $timeout.flush() unter Verwendung von nach dem Aufruf flush können die ursprüngliche Funktion. Damit sollten Sie auf die successCallback zugreifen können.

Auch würde ich die spy und expect des showSuccessMessage außerhalb des anderen spy

describe('method add', function() { 
    it('should add', function() { 
     spyOn(SomeService, 'add').and.callFake(function(id, successCallback, errorCallback) { 
      successCallback(); 
     }); 
     spyOn(scope, 'showSuccessMessage'); 
     scope.add(); 
     $timeout.flush(); 
     expect(SomeService.add).toHaveBeenCalled(); 
     expect(scope.showSuccessMessage).toHaveBeenCalled(); 
    }); 
}); 
Verwandte Themen