AngularJS Jasmine测试 - 如何测试在控制器负载上调用的AJAX函数

时间:2015-05-27 22:42:03

标签: angularjs jasmine karma-jasmine

我有一个看起来像的控制器:

myApp.controller('myController', function($scope, myService){

    $scope.myFunction = function(){
        myService.myAJAXCall().then(function(data){
            $scope.myVariable = data;
        }, function(){
            console.log('failed call');
        });
    };
    $scope.myFunction();

    $scope.$watch('myVariable', function(newValue){
        if(newValue === 'something'){
             $scope.test = true;
        }
        else{
             $scope.test = false;
        }
    });

});

$scope.myFunction()对端点进行AJAX调用,并使用返回的值设置$scope.myVariable。我在页面加载时调用$scope.myFunction()

我想在$scope.myVariable上测试手表。如果我不通过以下方式调用控制器加载$scope.myFunction(),我可以成功完成此操作

describe('myTest', function(){
    it('should test $scope.test', function(){
        scope.test = false;
        scope.myVariable = 'something';
        scope.$apply();
        expect(scope.test).toBeTruthy();
    });
});

但如果我在页面加载时调用$scope.myFunction(),这不起作用。使用scope.myVariable = 'something';进行的AJAX调用始终覆盖myService.myAJAXCall()声明。

如果我在控制器加载时调用$scope.myFunction(),我应该如何编写测试以免它遇到此冲突?

1 个答案:

答案 0 :(得分:0)

关键是在使用scope.$apply()的测试套件设置期间手动运行摘要周期。这刷新了我的AJAX调用,这让我可以测试$watch

beforeEach(inject(function($controller, $rootScope){
    scope = $rootScope.$new();
    $controller('myController', {
        $scope: scope,
        myService: myService
    });
    // Apply the digest cycle manually at initialization of test suite
    scope.$apply();
}));