如何获得当前路由的控制器(或范围)?

时间:2014-12-12 16:54:27

标签: angularjs ngroute

我有一个需要路由解析功能提供的东西的控制器:

$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.$scopemyCtrl我可以获得$scope,但ngView属性实际上并不存在,除非我们也使用$provide(设置为here)。

  • 控制器未在任何模块中注册,因此我无法使用{{1}}拦截其创建并将控制器藏匿在某处。

1 个答案:

答案 0 :(得分:1)

发现它,感谢@ PSL的评论。实际构建控制器的是ngView链接函数。我们可以很容易地伪装:

var ctrl = $controller(MyController, $route.current.locals);