在测试中等待stateChange

时间:2016-08-16 15:17:10

标签: javascript angularjs karma-mocha

我的控制器中有一个范围功能,带有一些异步功能。一切都完成后,它会改变状态。

controller.js

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

我可以用setTimeout()来测试它,但我觉得这很脏。

如何在测试中等待stateChange?

修改

我想为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');
    });
});

...

2 个答案:

答案 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');
    });
});

...

答案 1 :(得分:0)

您可以使用

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

等待你的任务完成,只要你能将它们包装在一个诺言中。

更多信息here