angularjs,测试状态重定向(ui.router)

时间:2015-05-15 15:08:22

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

好的,这里有一个菜鸟问题。

我有一个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调用不实例化状态控制器,我要手动实例化它? 我是否编写了正确的测试来测试这种重定向?

感谢您给予我的帮助。

0 个答案:

没有答案