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();
}));
我的控制器看起来像:
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();
}));