In meiner AngularJS-Anwendung habe ich Probleme, herauszufinden, wie der Einheitentest ausgeführt werden kann, wenn die Ausführung eines Versprechens eine location.url ändert. Ich habe eine Funktion, Login, die einen Service, AuthenticationService aufruft. Es gibt das Versprechen zurück, und die Ausführung des Versprechens ändert die location.url.AngularJS-Fehler: Unerwartete Anforderung (keine weiteren Anforderungen werden erwartet)
Dies ist der Controller AuthCtrl:
angular
.module('bloc1App')
.controller('AuthCtrl', ['$scope', '$http','$location', 'AuthenticationService',
function($scope, $http, $location, AuthenticationService) {
this.AuthenticationService = AuthenticationService;
var self = this;
$scope.login = function(username, password){
self.AuthenticationService
.login(username, password)
.then(function(){
$location.url('/tasks');
});
};
}
]);
Dies ist mein Versuch am Gerät zu testen:
describe('Controller: AuthCtrl', function() {
var scope,
location,
route,
q,
rootScope,
AuthCtrl;
beforeEach(module('bloc1App'));
beforeEach(inject(function($controller, $rootScope, $location, $route, $q) {
scope = $rootScope.$new();
q = $q;
rootScope = $rootScope;
location = $location;
route = $route;
AuthCtrl = $controller('AuthCtrl', {
$scope: scope,
$route: route,
$location: location
});
}));
it('login should redirect user to tasks view', function(){
var deferred = q.defer();
spyOn(AuthCtrl.AuthenticationService, 'login').andReturn(deferred.promise);
spyOn(location, 'url');
scope.login('foo', 'foo');
deferred.resolve();
scope.$apply();
expect(location.url).toHaveBeenCalledWith('/tasks');
});
});
Wenn ich diesen Test ausführen, bekomme ich diesen Fehler. Ich bekomme den gleichen Fehler, wenn ich rootScope verwenden $ apply() statt.
Error: Unexpected request: GET views/AuthView.html
No more request expected
Wenn ich Umfang nehmen $ apply(), ich diesen Fehler.
Expected spy url to have been called with [ '/tasks' ] but it was never called.
Alle Ideen, wie um das zu beheben? Dies ist das erste Mal, dass ich ein Versprechen in der Einheit teste, und ich bin wahrscheinlich konzeptionell falsch verstanden, wie das geht.
Vielen Dank im Voraus für Ihre Hilfe.
Vielen Dank für die schnelle Antwort! Der Dienst AuthenticationService führt HTTP-Anforderungen aus. Da ich den Controller teste, glaube ich nicht, dass dies eine Rolle spielen würde. Allerdings nahm ich Ihren Vorschlag und fügte den httpBackend-Mock mit expect hinzu, und nun funktioniert der Unit-Test! – cvk10