2017-12-19 8 views
1

Ich versuche, einen Code zu schreiben, um den Serviceaufruf zu testen, der in meinem Controller ausgeführt wird. Ich versuche, diese spezielle Funktion im Controller zu testen, der den Serviceanruf ausführt und die Daten bringt. Derzeit versuche ich mit lokalen json, aber es wird tatsächlich einen Service-Anruf.Ich kann keinen HTTP-Test der Einheit testen, der über den Controller erfolgt.

Ich habe gelernt, dass zuerst ich ein Spion-Objekt erstellen muss, aber ich bekomme den Fehler, mein Ziel ist es, Unit-Test erfolgreich den HTTP-Aufruf in der Controller passiert.

Ich bin neu in der Unit Testing .Pasting meinen Code, bitte Sie mir bitte helfen, kämpfen in diesem von vielen Tagen. Auch ich habe durch viele Lösungen gegangen, sie sind so unterschiedlich machen verwirrt.Ihre Hilfe ist sehr geschätzt

Servicecode:

//xlpApp is the module name 
    xlpApp.factory('xlpServices', ['$rootScope', '$http', function($rootScope, 
    $http) { 
    var xlpServices = {}; 
    xlpServices.getProgramData = function(){ 
      return $http.get(scripts/services/data/unitTesting.json'); 
    }; 

unitTesting.json Code:

{ 
    "name":"unit testing" 
    } 

Controller-Code:

$scope.events = { 

    programData: function(){ 
      xlpServices.getProgramData().then(function(response) { 
       if (response && response.data) { 
        $scope.testVariable= response.data.name; 
       } 
      }); 
     }, 
    selectSortingType : function(type) { 
      $scope.selectedSorting = type; 
      selectedFilter.sortingBy = $scope.selectedSorting; 
     } 

} 
$scope.events.programData(); 

Einheit Testcode:

describe('myProgramGpmCtrl', function() { 
    beforeEach(module('xlp')); 

    var $controller; 

    beforeEach(inject(function(_$controller_){ 
    $controller = _$controller_; 
    })); 

describe('service call test', function() { 
    var xlpServices , myService , $q; 
    var $scope = {}; 

    beforeEach(inject(function(xlpServices,_$q_){ 
     xlpServices = xlpServices; 
     $q = _$q_; 
     var controller = $controller('myProgramGpmCtrl', { $scope: $scope }); 
     myService = jasmine.createSpyObj('xlpServices',['getProgramData']); 
    })); 

    it('Service call test ', function() { 
     expect(myService.getProgramData).toHaveBeenCalled(); 
    }); 
}); 

}); 

ERROR:

 Expected spy xlpServices.getProgramData to have been called. 

Antwort

1

Probieren Sie etwas wie,

describe('service call test', function() { 
    var xlpServicesMock , myService , $q; 
    var $scope = {}; 

    beforeEach(inject(function(xlpServices,_$q_){ 
     xlpServicesMock = xlpServices; 
     $q = _$q_; 
     spyOn(xlpServicesMock ,'getProgramData').and.callFake(function() { 
     // we can return promise instead this custom object 
     return { 
      then: (callback, errorCallback) => { 
       callback('data to be passed to then callback'); 
       /* `callback` function should be invoked when you wanted to test the service for success response with status code 200. 
        `errorCallback` function should be invoked with 500 status code when you wanted to test the api failure 
       Ex: callback({status: 200, data: <your data here>); 
        errorCallback({status: 500, data: <your error data>}) 
       You can prepare the response to be passed as you wanted. 

       */ 

      } 
     }; 
     }); 

     var controller = $controller('myProgramGpmCtrl', { $scope: $scope, xlpServices: xlpServicesMock }); 

    })); 

    it('Service call test ', function() { 
     $scope.events.programData(); 
     expect(myService.getProgramData).toHaveBeenCalled(); 
    }); 
}); 

Es gibt gute Ressourcen online zur Verfügung. überprüfen here und here

+0

Vielen Dank für Ihre Hilfe. Für mich geht das . Nachdem Sie die Funktion toHaveBeenCalled() verwendet haben, können Sie mir sagen, wie ich überprüfen kann, ob die Serviceantwort 200 ist. Falls die Antwort 500 ist, wie kann ich das wissen? – GiggleGirl

+1

Aktualisierte die Antwort – Thaadikkaaran

+0

Danke für Ihre Hilfe. – GiggleGirl

Verwandte Themen