2016-08-16 3 views
0

У меня есть функция scope в моем контроллере с некоторыми функциями async. После того, как все сделано, оно меняет состояние.Дождитесь изменения состояния в тесте

controller.js

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

я мог проверить его с setTimeout(), но тем грязным я думаю.

Как подождать stateChange в моем тесте?

Edit:

Я хочу писать тесты для функции test() но это не обещание мне нужно следить за изменением состояния в тесте. Но как? Он работает с setTimeout(), но я не хочу использовать setTimeout(), потому что он просто не чувствует себя хорошо. Есть что-то вроде $scope.$watch для состояний?

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

Ваш вопрос непонятен. Вы хотите знать, как ждать завершения всех ваших асинхронных функций, чтобы вы могли изменить состояние или определить, когда состояние закончилось? –

ответ

1

Поскольку я редактировал вопрос для описания своей проблемы, я нашел решение. Можно прослушивать трансляции событий, поэтому можно использовать

... 

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

Вы можете использовать

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

Ждать ваши задачи до конца, до тех пор, как вы можете обернуть их в обещании.

Дополнительная информация here.

Смежные вопросы