如何在angularjs中对调用服务函数的函数进行单元测试

如何在angularjs中对调用服务函数的函数进行单元测试,angularjs,unit-testing,Angularjs,Unit Testing,我在控制器中有一个调用服务的基本函数,我想知道如何测试这个函数 控制器 服务 迄今为止的单元测试 现在,我如何对这个登录服务进行单元测试,我是否需要修改我的loginService.login()函数login以便进行测试等等。不确定它是如何完成的 要测试调用其他服务的服务,通常可以模拟这些其他服务(或仅模拟所需的服务),并验证调用的预期函数和传递的适当参数是否正确 当涉及$http或$resource时(它们依赖于$httpBackend),您可以模拟响应(或者只验证命中的某些端点) 关于如

我在控制器中有一个调用服务的基本函数,我想知道如何测试这个函数

控制器 服务 迄今为止的单元测试
现在,我如何对这个登录服务进行单元测试,我是否需要修改我的loginService.login()函数login以便进行测试等等。不确定它是如何完成的

要测试调用其他服务的服务,通常可以模拟这些其他服务(或仅模拟所需的服务),并验证调用的预期函数和传递的适当参数是否正确

当涉及
$http
$resource
时(它们依赖于
$httpBackend
),您可以模拟响应(或者只验证命中的某些端点)


关于如何使用
$http
parseService
authenticate
,您的问题中没有足够的信息,但根据我的推断,您可以监视
$locations
url
方法,或者验证
$scope.loginError
是否已正确设置


另请参见此

您似乎只需要模拟HTTP响应和$location服务,然后验证是否使用正确的参数调用了
$location.url
,或者是否正确设置了
$scope.loginError
。(我不确定“身份验证”来自何处。)身份验证只是一个布尔值,用于验证它是否设置为true,这意味着用户已登录,否则它不会登录。你能提供一个演示/或代码片段吗?因为我遇到了一个故障,怎么办(
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` 
}));
});