我正在尝试为 ui-router 的状态编写单元测试,但无法让它工作,以便$state.current
在我调用$state.transitionTo()
内部测试后在控制器内部包含正确的状态。
这适用于浏览器(transitionTo
由ui-router
内部调用),但不适用于单元测试(使用 Karma) - 我明确调用它。
这是控制器的代码:
angular.module( 'ngBoilerplate.about', [
'ui.router'
])
.config(function config( $stateProvider ) {
$stateProvider.state( 'about', {
url: '/about',
views: {
"main": {
controller: 'AboutCtrl',
templateUrl: 'about/about.tpl.html'
}
},
data: {
title: "About"
}
});
})
.controller( 'AboutCtrl', function AboutCtrl( $scope, $state ) {
console.log($state.get('about'));
console.log($state.current);
$scope.title = $state.current.data.title;
})
;
这是测试代码(Jasmine)about.spec.js
:
describe( 'AboutCtrl', function() {
var $scope, createController;
beforeEach( module( 'ngBoilerplate.about' ) );
beforeEach( inject( function( $controller, $rootScope, $state, $stateParams) {
$scope = $rootScope.$new();
createController = function() {
$state.transitionTo('about', {});
$rootScope.$digest();
return $controller( 'AboutCtrl', { $scope: $scope, $state: $state });
};
}));
it( 'should have title for about set', inject( function() {
var controller = createController();
expect($scope.title).toEqual('About');
}));
});
这会产生结果:
LOG: Object{url: '/about', views: Object{main: Object{controller: ..., templateUrl: ...}}, data: Object{title: 'About1'}, name: 'about'}
LOG: Object{name: '', url: '^', views: null, abstract: true}
Chrome 29.0.1547 (Linux) AboutCtrl should have title for about set FAILED
TypeError: Cannot read property 'title' of undefined
这表明状态正在初始化正常,但由于某种原因它没有改变,保持在大致初始化的状态。再说一遍:在真实的应用程序环境中调用此代码时,会显示正确填充的$state.current
内容,其中包含所有数据等。
我看过ui-router
's 的测试,看起来他们做的事情完全一样(那里$q.flush()
是装饰的$rootScope.$digest()
),所以我想这应该可行。
有什么提示吗?(到目前为止,我对一切都有角度的东西有点菜鸟:)