我在调用服务的控制器中有一个基本功能,并且想知道如何测试这个功能。
app.controller('loginCtrl', function($scope, loginService) {
$scope.login = function() {
loginService.login($scope);
}
});
app.factory('loginService', function(parserService, $location, $http {
return {
login : function(scope) {
parserService.get(function(data) {
if (scope.username === data.username
&& scope.password === data.password) {
authentication.isAuthenticated = true;
authentication.user = data.fullname;
authentication.userImg = data.imgUrl;
$location.url("/homepage");
} else {
scope.loginError = "Invalid login";
}
})
}
}
});
到目前为止it('should call loginservice and check credentials', inject(function($rootScope,
$controller, loginService) {
//create a new scope that's a child of the $rootScope
$scope = $rootScope.$new();
$scope.login = function (){};
spyOn($scope, "login");
ctrl = $controller('loginCtrl', {
$scope : $scope,
loginService : loginService
});
$scope.username = 'admin';
$scope.password = 'a';
expected($scope.login).toHaveBeenCalledWith(loginService.login($scope);
///Some logic here to return successful login with give credentials/ or error `invalid login`
}));
});
现在我如何对这个登录服务进行单元测试,是否需要修改我的loginService.login()函数登录才能进行测试等。不确定它是如何完成的!
答案 0 :(得分:1)
为了测试调用其他服务的服务,您通常可以模拟其他服务(或仅需要那些服务),并验证调用的预期函数和传递的适当参数。
当涉及$http
或$resource
时(依赖$httpBackend
),您可以模拟回复(或只是验证点击的某些端点)。
关于如何使用$http
,parseService
或authenticate
,您的问题没有足够的信息,但我可以推断您可以窥探$locations
&# 39; s url
方法或验证$scope.loginError
已正确设置。
另请参阅此 short demo 。