我有一个看起来像的控制器:
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()
,我应该如何编写测试以免它遇到此冲突?
答案 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();
}));