2016-09-30 13 views
0

私は時計でトリガされるangle指令の関数を持っています。どのようにスコープに含まれていないので、関数scrollのタイムアウトに基づくスクロール・アクティビティをテストしますか?watch関数を使って指示関数をテストする

scope.$watch('elementId', function(value) { 
    //How do i test scroll function contents? 
    scroll(element, value); 
}); 

function scroll (pE, element) { 
    console.log('Here'); 
    $timeout(function afterTimeout() { 
    var scrollTo = $('#' + element); 
    var container = $(pE); 
    container.animate({scrollTop : scrollTo[0].offsetTop - container[0].offsetTop - 10}, 'slow'); 
    }, 250); 
} 

詳細なコードは、私はあなたのコードをクリーンアップするためにいくつかの提案があり、ここで http://jsfiddle.net/QGmCF/68/

+1

実際のDOMをユニットテストすることはあまり面白いことではありません。 $ timeout呼び出しをテストする方法についてはhttp://stackoverflow.com/a/37527210/3731501を参照してください。範囲外であるため、範囲内にあるかどうかをテストする方が簡単であることはすでに分かっています。スコープ/コントローラメソッドとして 'scroll'関数を公開すると、これはテスト容易性に役立ちます。 – estus

+0

ああ大丈夫です。それを見てみましょう。ありがとう! – prem89

答えて

1

です。最初に気づくべきことは、モック$timeoutオブジェクトをテストに注入し、コードが実行されることを確認するために$timeout.flush(251)を呼び出すことです。

it('test watch', inject(function($compile, $rootScope, $timeout) { 
    // as before 
    $timeout.flush(251); 
    // test that your code has run 
})); 

もう一つの提案:代わりにjQueryの$オブジェクトを使用するのではなく、ブラウザのネイティブコンポーネントにアクセスするために$window.documentまたは$document[0]を使用してこのよう

var scrollTo = $document[0].getElementById(element); 

をして、あなたは、もはや[0]であなたのscrollTo要素にアクセスする必要はない:これで、あなたはこれを書くことができます。

関連する問題