5

Angular コントローラーの Jasmine 単体テストを実行すると、次のメッセージで失敗します。

'Error: 10 $digest() iterations reached. Aborting!'  

$httpbackend.flush() が呼び出されたとき。

これは私のコントローラーです:

theApp.controller("myCtrl", function($scope, $http, globalstate){
     $scope.currentThing = globalstate.getCurrentThing();
         $scope.success = false;

     $scope.$watch(globalstate.getCurrentThing, function(newValue, oldValue){
          $scope.currentThing = newValue;
     });

     $scope.submitStuff = function(thing){
          $http.put('/api/thing/PutThing', thing, {params: {id: thing.Id}})
          .success(function(){          
                $scope.success = true;
          })
     };
});

これは私のユニットテストです:

describe('myCtrl', function(){

    var myController = null;
    beforeEach(angular.mock.module('theApp'));

    beforeEach(inject(function($injector){
        $rootScope = $injector.get('$rootScope');
        scope = $rootScope.$new();

        $httpBackend = $injector.get('$httpBackend');

        $controllerService = $injector.get('$controller');
        mockGlobalState = {
            getCurrentThing : function(){
                return {Id: 1, name: 'thing1'};
            }
        };

        $controllerService('myCtrl', {$scope: scope, globalstate: mockGlobalState});
   }));

   it('should set flag on success', function(){
       var theThing = {Id: 2, name: ""};
       $httpBackend.expectPUT('/api/thing/PutThing?id=2',JSON.stringify(theThing)).respond(200,'');

       scope.submitStuff(theThing, 0);

       $httpBackend.flush();

       expect(scope.basicupdateSucceeded).toBe(true);
   });

});

$scope.$watch の 3 番目のパラメーターを true に設定すると (参照ではなくオブジェクトの等価性を比較する)、テストに合格します。

$httpbackend.flush() によって $watch がトリガーされるのはなぜですか? その後、なぜ時計は自動的に作動するのでしょうか?

4

1 に答える 1