0

Ich versuche, meine angularjs App durch QUnit Framework zu testen.
Auf der Seite mysite.ru/#/unittest/ - Ich verwende einen Controller namens UnittestCtrl. Aber in meiner App habe ich eine DetailCtrl und andere Seite, die ich testen möchte. Das Problem ist, dass ich keinen Zugriff auf den Bereich DetailCtrl von der Unittest-Seite bekommen kann.bekomme Umfang von einem bestimmten Controller in angularjs

Das ist der Code, den ich verwende, um den Geltungsbereich des Unittest-Controllers auf mysite.ru/#/unittest/ zu erhalten. Wie kann ich von DetailCtrl auf den Bereich zugreifen?

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

Ich habe auch versucht, dies hat aber kein Ergebnis:

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

Der Fehler: Unknown provider: $rootElementProvider <- $rootElement <- $location <- $route

Mein DetailCtrl

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

Antwort

0

angular.injector einen Injektor (ng Modul schafft, ist nicht geladen).

angular.bootstrap ruft angular.injector des Injektors zu erstellen (ng Modul geladen ist) und fügt es zu einigen DOM-Element. Es erstellt $rootElement Service.

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

Oder besser, angular-mock verwenden, die dies und noch viel mehr tut:

angular.bootstrap Funktionalität in Tests entsprechen, $rootElement sollte verspottet werden.

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

Es bindet sich an Jasmin und Mokka und lädt ngMock automatisch, aber es ist keine Option für QUnit.

Aber das eigentliche Problem, das hier angesprochen werden sollte, ist Router. In Unit Tests sollte das Gerät von anderen Geräten isoliert werden, andere Geräte ($route und $routeParams Service) sollten verspottet werden. Es kann in Injektor oder in $controller getan werden, die es ermöglicht, die Abhängigkeiten von Injektor zu überschreiben:

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

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