6 Stimmen

Prüfung der Variablen des übergeordneten Controllerscope in Angular JS mit Karma und Jasmine

Ich habe zwei Controller auf einer Seite. Sie sind in einer HTML-Markierung "eingewickelt", wobei einer der "Eltern" und der andere der "Kind" ist, wie folgt:

In den JS-Dateien für meine Controller verweise ich auf ein Objekt aus dem "Eltern"-Controller im "Kind"-Controller.

Eltern-Controller:

angular.module('myApp').controller('parentController', function($scope){
    $scope.myReferencedObject = {};
    $scope.myReferencedObject.someProperty = "hello world";
});

Kind-Controller:

angular.module('myApp').controller('childController', function($scope){
    $scope.childControllerVariable = $scope.myReferencedObject.someProperty;
});

Weil der "Kind"-Controller im "Eltern"-Controller verschachtelt ist, wird das Objekt aus dem Eltern-Controller im Kind-Controller geerbt.

Dies funktioniert in einem Karma-Test nicht, da alle Dateien in einzelne Einheiten aufgeteilt und separat getestet werden. Der Verweis $scope.myReferencedObject.someProperty ist in meinem "Kind"-Controller beim unit testing undefined, da es keine prototypische Vererbung gibt.

Wie löse ich dieses Problem in Karma?

9voto

rob Punkte 17027

Sie können den $scope initialisieren, um zu sein, was Sie wollen, wenn Sie Ihren Inner-Controller testen, damit Sie simulieren können, was der Eltern-Controller darauf gesetzt hätte

var controllerInstance;
beforeEach(inject(function ($controller, $rootScope) {
    scope = $rootScope.$new();
    scope.myReferencedObject = {someProperty: 'hello world'}
    controllerInstance = $controller('childController', {
      $scope: scope
    });
}));

0voto

Naveen Kumar V Punkte 2173

Dieser Code funktioniert für den Zugriff auf sowohl Parent als auch Child (mit neuem Scope-Objekt) Controller.

...

var childCtrl;
var parentCtrl;
var scope;

beforeEach(inject(function($rootScope, $controller) {
  scope = $rootScope.$new();
  // Erstens - Parent
  parentCtrl = $controller('ParentCtrl', {$scope: scope});
  // Zweitens - Child (auch mit neuem Scope-Objekt)
  ChildCtrl = $controller('ChildCtrl', {$scope: scope});
}));

... 

describe("Testen des Scopes von Parent und Child Controller", function() {

  it('parentObj', function(){
    expect(scope.parentObj).toBeDefined();
  });

  it('childObj', function(){
    expect(scope.childObj).toBeDefined();
  });

  it('parentObj.newPropCreatedInChild', function(){
    expect(scope.parentObj.newPropCreatedInChild).toBeDefined();
  });

});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X