我遇到了使用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路由器能够将应用程序转换到正确的状态,但控制器不会被初始化。当路由器将关键配置传递给它们时,我需要路由器初始化控制器。我想避免在测试中复制该配置。
我必须遗漏一些东西,但是什么?我感谢任何和所有的意见,谢谢!
答案 0 :(得分:0)
您需要使用$ controller服务在测试中实例化控制器并将其传递给您的范围。例如......
ctrl = $controller('TestCtrl', {$scope: scope});
请注意,我还将$ rootScope.done的声明移到了TestCtrl,以防止有关$ rootScope.done未定义的错误。这是小提琴......