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
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 –
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