2014-12-12 6 views
2

У меня есть контроллер, который нуждается вещью, представленная функция маршрута постановляет:Как получить текущий контроллер маршрута (или область)?

$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 (он получает набор here).

  • Контроллер не зарегистрирован ни в одном модуле, поэтому я не могу использовать $provide, чтобы перехватить его создание и спрятать контроллер где-нибудь.

+0

Не можете использовать [ '$ controller'] (https://docs.angularjs.org/api/ng/service/$controller) передать в конструктор вернулся по '$ route.current.controller'? – PSL

ответ

1

Обнаружено, спасибо @ комментариям PSL. Вещью, которая фактически создает контроллер, является функция связи ngView. Мы можем поддельной, что достаточно легко:

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