2016-09-30 7 views
0

Ich habe eine Funktion in Winkelanweisung, die auf der Uhr ausgelöst wird. Wie überprüfe ich die Timeout-basierte Scrolling-Aktivität der Funktion scroll seit es nicht im Geltungsbereich? Testen Sie eine Richtlinie Funktion durch Uhr

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); 
} 

Die detaillierte Code ist hier http://jsfiddle.net/QGmCF/68/

+1

Unit-Tests ein echtes DOM ist nicht sehr erfreulich Aufgabe. In diesem http://stackoverflow.com/a/37527210/3731501 erfahren Sie, wie Sie $ Timeout-Aufrufe testen können. Da es nicht im Geltungsbereich ist, wissen Sie bereits, dass es einfacher wäre, zu testen, ob es sich um einen Bereich handelt. Expose 'scroll' Funktion als Scope/Controller-Methode, dies wird Testbarkeit profitieren. – estus

+0

Ah okay..wird sich das mal anschauen. Danke! – prem89

Antwort

1

ich ein paar Vorschläge haben den Code zu bereinigen. Das erste, was zu realisieren ist, dass Sie das Pseudoobjekt $timeout in Ihren Test injizieren und $timeout.flush(251) aufrufen sollten, um sicherzustellen, dass Ihr Code ausgeführt wird.

So:

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

Ein weiterer Vorschlag: Statt $ Objekt jQuery verwenden, verwenden $window.document oder $document[0] zu dem nativen Komponenten des Browsers zugreifen. Mit diesem können Sie schreiben:

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

und dann nicht müssen Sie länger mit [0] Ihr scrollTo Element zugreifen.

Verwandte Themen