0

Я пытаюсь проверить мое приложение angularjs через рамки QUnit.
На странице mysite.ru/#/unittest/ - Я использую контроллер под названием UnittestCtrl. Но в моем приложении у меня есть DetailCtrl и другая страница, которую я хочу протестировать. Проблема в том, что я не могу получить доступ к области DetailCtrl со страницы unittest.получить область от определенного контроллера в angularjs

Это код, который я использую для получения области управления Unittest на mysite.ru/#/unittest/. Как получить доступ к области от DetailCtrl?

var appElement = document.querySelector('[ng-app=TheApp]'); 
var appScope = angular.element(appElement).scope(); 
var controllerScope = appScope.$$childHead; 
console.log(controllerScope.link); 

Я также попытался это, но это не имеет никакого результата:

var serviceLocator = angular.injector(["TheApp"]) 
scope = serviceLocator.get('$rootScope') 
var $controller = serviceLocator.get('$controller'); 
$controller('DetailCtrl', { 
       $scope: scope 
      }); 

Ошибка: Unknown provider: $rootElementProvider <- $rootElement <- $location <- $route

Мои DetailCtrl

Controllers.controller('DetailCtrl', ['$scope', '$routeParams', '$http', '$route', 
function($scope, $routeParams, $http, $route) { 
    $scope.reloadRoute = function() { 
    window.location.reload(); 
    }; 
    $scope.cityId = $routeParams.cityId; 
... 

ответ

0

angular.injector создает инжектор (ng модуль не является загружен).

angular.bootstrap вызывает angular.injector для создания модуля форсунки (ng) и прикрепляет его к некоторому элементу DOM. Он создает услугу $rootElement.

Чтобы соответствовать angular.bootstrap функциональности в тестах, $rootElement должны быть издевались:

angular.injector([ 
    'ng', 
    ($provide) => { 
    $provide.value('$rootElement', angular.element('<div>')) 
    }, 
    'app' 
]); 

Или лучше использовать angular-mock, что делает это и многое другое.

angular.injector(['ngMock', 'app']); 

Он связывает себя с Жасмин и мокко и загружает ngMock автоматически, но это не вариант для QUnit.

Но актуальной проблемой, которая должна быть здесь, является маршрутизатор. В модульных испытаниях блок должен быть изолирован от других устройств, другие устройства ($route и $routeParams) должны быть издевались. Это может быть сделано в инжекторе или в $controller, что позволяет переопределить зависимости от инжектора:

var mockedRoute = { ... }. 
var mockedRouteParams = { ... }; 

$controller('DetailCtrl', { 
    $scope: scope, 
    $route: mockedRoute, 
    $routeParams: mockedRouteParams 
});