角度控制器未在茉莉花测试中初始化

时间:2014-03-09 13:34:48

标签: javascript angularjs jasmine angular-ui-router

我遇到了使用angular ui-router为AngularJS应用程序编写茉莉花测试的问题。我的服务和应用程序在测试中正确初始化,但控制器无法正常启动。我将问题中的应用程序从等式中移除,并将问题简化为一个简单的控制器示例,该示例表现出相同的行为。这是实际的测试代码:

describe('Test', function() {
    var async = new AsyncSpec(this);
    var scope = {};

    beforeEach(angular.mock.module('TestApp'));

    beforeEach(angular.mock.inject(function($rootScope, $state, $templateCache) {
        scope.$rootScope  = $rootScope;
        scope.$state      = $state;

        $templateCache.put('start.html', '<div class="start"></div>');
    }));

    async.it('Test that TestCtrl is initialized', function(done) {
        scope.$rootScope.status = { done: false };
        scope.$rootScope.$on('$stateChangeSuccess', function(event, state, params) {
            expect(scope.$rootScope.status.done).toBe(true);
            done();
        });
        scope.$state.transitionTo('start', {}, { notify: true });
        scope.$rootScope.$apply();
    });
});

这是完整的可运行test

应用程序被正确初始化,ui路由器能够将应用程序转换到正确的状态,但控制器不会被初始化。当路由器将关键配置传递给它们时,我需要路由器初始化控制器。我想避免在测试中复制该配置。

我必须遗漏一些东西,但是什么?我感谢任何和所有的意见,谢谢!

1 个答案:

答案 0 :(得分:0)

您需要使用$ controller服务在测试中实例化控制器并将其传递给您的范围。例如......

ctrl = $controller('TestCtrl', {$scope: scope});

请注意,我还将$ rootScope.done的声明移到了TestCtrl,以防止有关$ rootScope.done未定义的错误。这是小提琴......

http://jsfiddle.net/C8QtB/3/