【问题标题】:jasmine testing controller calling service from scope function茉莉花测试控制器从范围函数调用服务
【发布时间】:2014-10-22 14:02:46
【问题描述】:

我有一个控制器,它在 $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 失败。

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

【问题讨论】:

    标签: angularjs testing jasmine


    【解决方案1】:

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

    //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);
     });
    

    【讨论】:

      猜你喜欢
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多