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

时间:2014-06-15 18:57:20

标签: angularjs unit-testing

我在调用服务的控制器中有一个基本功能,并且想知道如何测试这个功能。

控制器

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()函数登录才能进行测试等。不确定它是如何完成的!

1 个答案:

答案 0 :(得分:1)

为了测试调用其他服务的服务,您通常可以模拟其他服务(或仅需要那些服务),并验证调用的预期函数和传递的适当参数。

当涉及$http$resource时(依赖$httpBackend),您可以模拟回复(或只是验证点击的某些端点)。


关于如何使用$httpparseServiceauthenticate,您的问题没有足够的信息,但我可以推断您可以窥探$locations&# 39; s url方法或验证$scope.loginError已正确设置。

另请参阅此 short demo