2017-05-02 4 views
0

私は単純にぼかしの入力をクリアする次の関数を持っています。私は角度のある素材を使用しています。私はそれが起こりたい時に追加する指示を作成しています。ジャスミンを使用してネストされたタイムアウトを使用してJavaScript関数をテストするには

function clearTextOnBlurLink(scope, element, attrs, controller) { 
      $timeout(function() { 
       var input = element.find('input'); 
       input.on('blur', function(e){ 
        setTimeout(function(){ 
         input.val('');    
         input.triggerHandler('input'); 
        }, 100);     
       }); 
      },0); 
     } 

私はそれをテストしたいが、それを動作させることはできない。

は、ここに私のテストです:

beforeEach(inject(function(_$rootScope_, _$compile_, _$timeout_) { 

       $scope = _$rootScope_.$new(); 
       $compile = _$compile_; 
       $timeout = _$timeout_;   
       $scope.searchText = 'blah'; 

       element = angular.element('\ 
        <div mx-clear-on-blur> <input ng-model="searchText1"> </div>\ 
       '); 

       element = $compile(element)($scope); 
       $scope.$apply(); 
       $timeout.flush();  
     })); 
it('clears text on blur', function() { 
     var input = element.find('input').eq(0); 

     expect(input.val()).toBe('blah'); 
     expect($scope.searchText).toBe('blah'); 

     input1.triggerHandler('blur'); 

     expect(input.val()).toBe(''); 
     expect($scope.searchText).toBe(''); 


    }); 

[OK]を、だから私はそれが$タイムアウトへのsetTimeoutを変える動作するようになりました。 2回のタイムアウトがなければ、それほど厄介な方法はありませんか?

+0

input1.triggerHandler('blur'); setTimeout(function() { expect(input.val()).toBe(''); expect($scope.searchText).toBe(''); }, 100); 

ジャスミンもwaitsForメソッドを持っている必要がありますコードが非同期になりました。 onValueChangeフックで入力要素をモックしようとするかもしれません。または、関数内でsetTimeoutの代わりに$ timeoutを使用するだけです。 – Nosyara

答えて

0

setTimeoutを2回目に使用する理由はありますか?ちょうど$timeoutをもう一度使ってみませんか?また$timeoutは通常コードのにおいのビットなので、ネストした$timeoutsは少し間違った感じがする。 :p

とにかく、あなたのテストでは、ぼかし後にテストで$timeout.flush()が必要になると思います。

+0

私はsettimeout ..ダムの間違いを使用していたと私は気付かなかった。私はそれを$ timeoutに変更し、ぼかし後にフラッシュして動作しました。私はその2回目のフラッシュを持っていましたが、setTimeoutのために作業ができませんでした。 私は2つの理由で2つのタイムアウトを使用しています。私が最初に必要とするのは、ページが読み込まれているので、既存の要素にイベントを追加できます。 2番目は、そのディレクティブをチップ内のオートコンプリートに追加したためです。タイムアウトがない場合は、チップを選択しても選択できません。チップを選択すると選択が解除されるためです。 より洗練されたソリューションがあれば、私はすべて耳にします:) –

0

あなたも、あなたのテスト内のsetTimeoutを使用することができますしているあなたは$タイムアウトを注入するが、あなたの関数内であなたがsetTimeoutメソッドを使用している

input1.triggerHandler('blur'); 
waitsFor(function() { 
    return false; 
}, 100); 
expect(input.val()).toBe(''); 
expect($scope.searchText).toBe(''); 
関連する問題