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

AngularJS Jasmine Testing - How to Test AJAX Function That is Called on Controller Load

我的控制器看起来像:

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'; 声明总是被 myService.myAJAXCall() 调用的 AJAX 覆盖。

如果我在控制器加载时调用 $scope.myFunction(),我应该如何编写我的测试才不会 运行 陷入冲突?

关键是在使用 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();
}));