AngularJS Jasmine测试$ state.current为空

时间:2018-03-22 22:36:51

标签: angularjs jasmine angular-ui-router karma-jasmine

我编写了一个组件,其中$ onInit检查$ state以设置一些变量。

在我的路由器配置中,我有:

azureml

在我的组件中,我正在做一些事情:

$stateProvider.state('app.students', {
    abstract: true,
    url: '/students'
});

$stateProvider.state('app.students.active', {
    url: '/active',
    component: 'listing',
    data: {
        tab: 'active'
    }
});

运行应用程序时效果很好。

然而,来测试,我遇到了一个问题,我已经坚持了很久。这是我测试中所写内容的简化版本:

const vm = this;
vm.myStateName = $state.current.name;
vm.myStateData = $state.current.data;

但这永远不会被赋予任何东西。

如果我尝试在测试中记录let $state, $rootScope, componentCtrl = null; beforeEach(angular.mock.inject((_$state_, _$rootScope_, $componentController) => { $state = _$state_; $rootScope = _$rootScope_; componentCtrl = $componentController('listing', { $scope: $rootScope.$new(), $state: $state }); })); it('Should append the current model', () => { $state.go('app.students.active'); $rootScope.$digest(); componentCtrl.$onInit(); expect(componentCtrl.data.tab).toEqual('active'); }); ,我总是会遇到'空'类型状态,例如$state.current

经过大量研究后,我发现我不是唯一一个有这个问题的人,但没有关于这些线程的建议完全解决了我的问题: https://github.com/angular-ui/ui-router/issues/1627

是因为我的父母是一条抽象路线吗?如果是这样,我如何访问嵌套的子状态?

1 个答案:

答案 0 :(得分:0)

尝试下面它肯定会起作用,因为它稍后会被填充并且浏览器会做出反应。尝试将带有$ state的块包含在$ timeout()中。在获取值之前等待$ digest周期结束是一个技巧。

$timeout(function() { console.log("******",$state.current.name); },1000);

plunker http://plnkr.co/edit/xIpkOeaQ3XyhB5gz1SnJ?p=preview