2016-03-30 4 views
4

フラグが設定されている場合、5秒ごとに呼び出される再帰的な方法があります。私は、メソッドを偵察して、それを呼び出して、6秒待ってからメソッドが2回呼び出されると期待しているテストを書くことを試みています。私のテストは失敗します。スパイはメソッドが一度だけ呼び出される(最初の呼び出し)と報告します。再帰角制御法でのスパイク

私はAngular style guideを使用していますので、これらのメソッドをthisのプレースホルダーに付けています。私は、角度モック$controller()から返されたコントローラのスコープに問題があるかもしれないと思うが、わからない。ほとんどの人が方法を$scopeにつけている。

$scopeにメソッドを追加しないで、自分のメソッドが2回呼び出されたことを確認するスパイを作成するにはどうすればよいですか?

app.js:

'use strict'; 

angular 
    .module('MyApp', [ 
     //... 
    ]); 

angular 
    .module('MyApp') 
    .controller('MyController', MyController); 

MyController.$inject = [ 
    //... 
]; 

function MyController() { 
    var vm = this; 

    vm.callMyself = callMyself; 
    vm.flag = false; 

    function callMyself() { 
     console.log('callMyself'); 
     if (vm.flag) { 
      console.log('callMyself & flag'); 
      setTimeout(vm.callMyself, 5000); 
     } 
    } 
} 

appSpec.js:

describe('MyController', function() { 

    var $scope; 

    beforeEach(function() { 
     module('MyApp'); 
    }); 

    beforeEach(inject(function($rootScope, $controller) { 
     $scope = $rootScope.$new(); 
     controllerInstance = $controller('MyController', {$scope: $scope}); 
    })); 

    it('should call itself within 6 seconds if flag is true', function (done) { 
     controllerInstance.flag = true; 
     spyOn(controllerInstance, 'callMyself'); 
     controllerInstance.callMyself(); 
     setTimeout(function() { 
      expect(controllerInstance.callMyself).toHaveBeenCalledTimes(2); 
      done(); 
     }, 6000); 
    }, 7000); 
}); 

Working Plunker

答えて

3

あなたはさらに自分自身を呼ぶような機能を実行するために.and.callThrough()を使用する必要があります。

によってchaスパイをとすると、スパイはまだにすべての呼び出しを追跡しますが、実際の実装に委任します。それが動作 - plunkerでテスト

spyOn(controllerInstance, 'callMyself').and.callThrough(); 

関連する問題