茉莉花测试控制器从范围功能调用服务

时间:2014-10-22 14:02:46

标签: angularjs testing jasmine

我有一个控制器,在$ scope中公开了一个调用服务的函数,loginService

$scope.validateCredentials = function (callback){
            loginService.validate($scope.username, $scope.password)
            .then(function (){
                self.credentialsRight();

                if (typeof callback !== "undefined") {
                    callback("credentials right callback");
                }
            }, function (){
                self.credentialsWrong();

                if (typeof callback !== "undefined") {
                    callback("credentials wrong callback");
                }
            })
        }

我已经设法测试前面提到的方法是否正常使用像这样的茉莉花

进行测试
it("validateCredentials  - passing in the right credentials", function() {
    spyOn(loginService, 'validate').andCallFake(function() {
        return successfulDeferred.promise;
    });

    $scope.validateCredentials(function() {
        expect($scope.error).toBe(false);
    });

    $scope.$apply();
});

我之所以使用间谍调用andCallFake是因为我想假装一个承诺被退回。请注意我尝试使用$ httpBackend.onPOST unusccefully。

但是,我觉得在我的控制器中使用回调仅用于测试和处理异步响应是很奇怪的。你们知道更好的实施方法吗?我已经看过waitsFor和run但似乎对我不起作用。

1 个答案:

答案 0 :(得分:1)

这是我在代码库中的类似测试。您需要适应您的解决方案。但基本上你需要在调用服务方法后调用deferred.reject(someData)。然后,您可能需要在根范围上调用摘要。然后测试你的期望。用loginService替换personApi。

//setup the controller
var $scope, ctrl, deferred, personApi, rootScope, log,basePerson;
beforeEach(inject(function ($rootScope, $q, $controller, _personApi_) {
    rootScope = $rootScope;
    $scope = $rootScope.$new();
    deferred = $q.defer();
    personApi = _personApi_;
    ctrl = $controller('personCtrl', {
        $scope: $scope,
        personApi: personApi
    });
}));

it('should map returned errors to the original object', function () {
      spyOn(personApi, 'save').and.callFake(function () {
            return deferred.promise;
      });
      $scope.person = basePerson;
      deferred.reject(stronglyNamedErrors);
      $scope.savePerson();
      $scope.$root.$digest();
      expect($scope.person.firstNameError).toBe(stronglyNamedErrors.firstNameError);
 });