2016-08-16 1 views
0

Ich habe eine Scope-Funktion in meinem Controller mit einigen asynchronen Funktionen. Nachdem alles erledigt ist, ändert sich der Zustand.Warten auf stateChange im Test

controller.js

$scope.test = function() { 
    async().then(function() { 
     $state.go('somewhere'); 
    }); 
}; 

ich es mit setTimeout() testen konnte, aber das ist schmutzig denke ich.

Wie warte ich auf den stateChange in meinem Test?

Edit:

Ich mag Unit-Tests für die test() Funktion schreiben, aber wie es ist kein Versprechen, das ich brauche für die Zustandsänderung in dem Test zu beobachten. Aber wie? Es funktioniert mit setTimeout(), aber ich möchte nicht setTimeout() verwenden, weil es einfach nicht richtig fühlt. Gibt es so etwas wie $scope.$watch für Staaten?

test.js

... 

it('test()', function (done) { 
    $scope.test(); 
    setTimeout(function() { // I want this replaced with a listener for state 
     expect($scope.someVar).to.be.equal('value'); 
     expect($state.current.name).to.be.equal('somewhere'); 
    }); 
}); 

... 
+0

Ihre Frage ist nicht klar. Möchten Sie wissen, wie Sie nach dem Ausführen aller asynchronen Funktionen warten müssen, damit Sie den Status ändern oder feststellen können, wann der Status geändert wurde? –

Antwort

1

Während ich die Frage redigierte, um mein Problem zu beschreiben, fand ich die Lösung. Es ist möglich, für Broadcast-Ereignisse zu hören, so dass es möglich ist zu verwenden

... 

it('test()', function (done) { 
    $scope.test(); 
    $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) { 
     expect($scope.someVar).to.be.equal('value'); 
     expect(toState.name).to.be.equal('somewhere'); 
    }); 
}); 

... 
0

Sie

$q.all.(promises).then( function(){ $state.go() });

für Ihre Aufgaben fertig zu warten, um verwenden, solange man sie in ein Versprechen wickeln kann.

Weitere Informationen here.