2016-07-06 9 views
0

Ich fange gerade an, meinen Kopf um Unit Testing und eckigen 1.2. Ich verwende den $ httpBackend-Dienst zum Testen eines $ httpcall in einem Dienst. Dieser Service ist in meinem Controller genannt:

var app = angular.module('myApp', []); 

app.controller('MainCtrl', function (someService) { 
    var vm = this; 
    vm.hasError = false; 

    //debugger; 
    someService.someAsyncCall() 
     .then(function (data) { 
      vm.hasError = false; 
     }) 
     .catch(function (data) { 
      vm.hasError = true; 
     }); 
}); 

app.factory('someService', function ($http) { 
    return { 
     someAsyncCall: function() { 
      return $http.get("/data") 
       .success(function (data) { 
        //return true 
       }) 
       .error(function() { 
        console.log('error'); 
        //return false 
       }); 
     } 
    }; 
}); 

ich für einen Test zu schreiben versuchen, wenn der Endpunkt ist falsch:

beforeEach(function() { 
     someServiceMock = jasmine.createSpyObj('someService', ['someAsyncCall']); 
     module('myApp'); 

     inject(function ($rootScope, $controller, $q, _$timeout_,$httpBackend) { 
      $scope = $rootScope.$new(); 
      someServiceMock.someAsyncCall.andReturn($q.when('weee')); 
      $timeout = _$timeout_; 
      controllerService = $controller; 
      httpMock = $httpBackend; 
     }); 
    }); 


    it("should set hasError=true with error request", function() { 
     httpMock.expectGET("/datajfds").respond(false); 
     ctrl = controllerService('MainCtrl', {someService: someServiceMock}); 
     expect(ctrl.hasError).toBe(true); 
    }); 

Dies ist der Fehler:

MainCtrl Tests sollten eingestellt hasError = true mit Fehleranforderung.

Expected false to be true. 
Error: Expected false to be true. 
    at new jasmine.ExpectationResult (http://cdnjs.cloudflare.com/ajax/libs/jasmine/1.3.1/jasmine.js:114:32) 
    at .toBe (http://cdnjs.cloudflare.com/ajax/libs/jasmine/1.3.1/jasmine.js:1235:29) 
    at .<anonymous> (http://run.plnkr.co/Q77IyPb6agUqgR2U/specs.js:37:31) 

Grundsätzlich würde Ich mag Abdeckung erhalten/einen Test für schreiben, wenn der someService.someAsyncCall() einen Fehler fangen. Wie kann ich diesen Test schreiben, so dass ctrl.hasError = true?

plunkr: http://plnkr.co/edit/aX29h4k64ZUm6hDedZl6?p=preview

Antwort

0

Es gab viele Probleme mit dem, was du getan hast, und ich verstehe nicht, was Sie mit dem dritten Test zu tun versuchen. Die API, die Sie getroffen haben, ist im Service konfiguriert.

$http.get("/data") 

Sehen Sie diese plunker die, dass die Tests sein könnte, die Sie versuchten, zu tun. Einige Probleme:

Sie wurden Injektion eine Menge Dinge, die nicht

Ihr Service-Aufruf benötigt wurden, wurde nicht wiederkehr nichts.

Sie wurden den Wert aus dem Service-Aufruf nicht immer

+0

Guter Versuch, nur eine Frage: für die letzte Spezifikation wird die vm.hasError gesetzt, obwohl das dann() Teil. Es soll den catch() -Teil durchlaufen. Siehe auch: http: //plnkr.co/edit/EoIgQuoeIwD5eP0JLXIn? P = Vorschau –

+0

Der Fang wird nur ausgeführt, wenn der Dienst, den Sie versuchen, einen Fehler zurückgegeben hat. Dies bedeutet, dass der Dienst aufgrund eines Fehlers nicht antworten kann. Ich habe den dritten Test aktualisiert, um zu zeigen, wie Sie $ httpBackend verwenden können, um den Dienst dazu zu bringen, einen Fehler auszulösen. – ScottL