好的,这里有一个菜鸟问题。
我有一个profileController控制器,它有一个activate方法,如果未经过身份验证,会将用户重定向到主页。 我想测试这样的功能。
控制器:
(function () {
'use strict';
angular
.module('nocc.profile.controllers', [])
.controller('ProfileController', ProfileController);
ProfileController.$inject = ['request', '$state', 'profileService'];
/**
* @namespace ProfileController
* @description Controller of the profile view
*/
function ProfileController(request, $state, profileService) {
var vm = this;
activate();
/**
* @summary Activates the controller
* @description Actions to be performed when this controller is instantiated
* @memberOf nocc.profile.controllers.ProfileController
*/
function activate() {
// If the user is not authenticated, he should not be here.
if (!request || !request.user) {
$state.go('home', {}, {reload: true});
}
}
}
})();
所以我的topbar中有一个链接,调用state.go('profile')
。路由以这种方式定义:
(function () {
'use strict';
angular
.module('nocc.profile.routes', ['ui.router'])
.config(config);
config.$inject = ['$stateProvider'];
/**
* @summary config
* @description Defines profile routes
*/
function config( $stateProvider ) {
$stateProvider.state( 'profile', {
url: '/profile',
parent: 'loggedIn',
views: {
"main": {
controller: 'ProfileController',
controllerAs: 'vm',
templateUrl: 'profile/templates/profile.tpl.html'
}
},
data:{ page_title: 'Profile' }
});
}
})();
一切按预期工作。我想为重定向编写一个测试,我结束了这个:
describe( 'profile', function() {
var authenticationService, rootScope, scope1, state, controller;
beforeEach( module( 'nocc' ) );
beforeEach(inject(function($controller, $rootScope, $state) {
rootScope = $rootScope;
scope1 = $rootScope.$new();
state = $state;
controller = $controller;
spyOn($state, 'go');
}));
/**
* Profile page should redirect to home page if user's not authenticated
*/
it( 'checking profile when non authenticated', function() {
state.go('profile');
rootScope.$digest();
expect(state.go).toHaveBeenCalledWith('profile');
state.go.reset();
controller('ProfileController', {
request: {},
$scope: scope1,
$state: state
});
expect(state.go).toHaveBeenCalledWith('home', {}, {reload: true});
});
});
测试没问题,成功了。但我不确定我在这里做的是对的。特别是我认为我不需要在测试中实例化控制器,因为我认为它是作为调用state.go('profile')
的结果而实例化的。但是如果我删除了Controller实例化,事实证明state.go
只用param'profile'调用一次,因此不会发生重定向。显然,在运行的应用程序中不是这种情况,因为在更改状态时实例化控制器并且执行激活功能并重定向到主页。
这是测试的行为吗?
为什么state.go
调用不实例化状态控制器,我要手动实例化它?
我是否编写了正确的测试来测试这种重定向?
感谢您给予我的帮助。