我有一个需要路由解析功能提供的东西的控制器:
$routeProvider.when('/some/url', {
controller: MyController,
controllerAs: 'myCtrl',
resolve: {
theAnswer: ['deepThought', function(deepThought) {
return deepThought.computeTheAnswerAndReturnAPromise();
}]
}
});
var MyController = ['$route', function($route) {
this.theAnswer = $route.current.theAnswer;
}];
现在我想进行端到端测试,检查路由是否匹配,以及参数是否正确传播:
// ...set up the routes...
$location.path('/some/url');
$rootScope.$digest();
var ctrl = ???;
expect(ctrl.aThing).toBe(42);
在非测试设置中,我可以输入一个日志语句,看看控制器是否正在成功创建并获得正确的数据注入。 唯一的问题是:如何在测试中掌握控制器?
有$route.current.controller
,但它包含控制器的构造函数,而不是控制器实例。
documentation承诺$route.current.locals.$scope
,myCtrl
我可以获得$scope
,但ngView
属性实际上并不存在,除非我们也使用$provide
(设置为here)。
控制器未在任何模块中注册,因此我无法使用{{1}}拦截其创建并将控制器藏匿在某处。
答案 0 :(得分:1)
发现它,感谢@ PSL的评论。实际构建控制器的是ngView
链接函数。我们可以很容易地伪装:
var ctrl = $controller(MyController, $route.current.locals);