2013-08-22 7 views
5

Während grunt test auf einem Yeoman (1.0RC1) gerüstet Angular (1.0.7) App laufen, bekomme ich die folgende Fehler:

TypeError: 'undefined' is not a function (evaluating '$scope.$parent.userLoggedIn(true)') 

userLoggedIn() ist in einem übergeordneten Steuergerät index.js. Die Funktion selbst läuft innerhalb der eckigen App gut.

Dieser Fehler tritt nicht auf anderen booleschen Variablen oder Zeichenfolgenvariablen im Controller auf, sodass er direkt mit dem Aufrufen von Funktionen in einem übergeordneten Element in Beziehung steht.

Ich denke, dass ich entweder $scope.$parent den falschen Weg benutze oder dass ich meine index.js Controller im Test definieren muss, aber Karma Test Dokumentation ist sporadisch, so ist es schwer zu wissen.

EDIT: Hier ist die Steuerung:

'use strict'; 

angular.module('uiApp') 
    .controller('LookupCtrl', ['$scope', function ($scope) { 
    $scope.awesomeThings = [ 
     'HTML5 Boilerplate', 
     'AngularJS', 
     'Karma' 
    ]; 

    $scope.$parent.userLoggedIn(true); 

    }]); 

Hier wird der Test.

'use strict'; 

describe('Controller: LookupCtrl', function() { 

    // load the controller's module 
    beforeEach(module('uiApp')); 

    var LookupCtrl, 
    scope; 

    // Initialize the controller and a mock scope 
    beforeEach(inject(function ($controller, $rootScope) { 
    scope = $rootScope.$new(); 
    LookupCtrl = $controller('LookupCtrl', { 
     $scope: scope 
    }); 
    })); 

    it('should attach a list of awesomeThings to the scope', function() { 
    expect(scope.awesomeThings.length).toBe(3); 
    }); 

}); 

(Ja, ich weiß, ich bin gerade jetzt den Standard-awesomeThings Test Ich bin neu zu eckigen Tests).

+0

Könnten Sie bitte Ihren Code für den Testcontroller angeben. – BKM

+0

Im Allgemeinen bedeutet das nur, dass Sie versuchen, einen Eigenschaftsnamen zu verwenden, um eine Funktion zu finden, aber das Objekt, mit dem Sie arbeiten, hat keine solche Eigenschaft. Sie versuchen also, "undefined" als Funktion zu verwenden, und das ist keine Funktion. – Pointy

Antwort

1

Sie geben dem Controller eine , die nicht $parent (es ist die Wurzel) hat. Ändern Sie Ihren Controller-Code, um ihn korrekt zu verwenden (mit der Prototyp-Kette) und Sie werden in Ordnung sein, indem Sie einfach {my: props} als ein Objekt übergeben.

+0

Ich habe es zur Arbeit, aber ich bin mir nicht sicher, ob ich es richtig gemacht habe. Ich habe meine IndexCtrl vor der LookupCtrl im Test hinzugefügt und den Root-Bereich innerhalb dort genannt. – Sartaj

+0

Ich habe meine 'IndexCtrl' vor der 'LookupCtrl' im Test hinzugefügt und' var scope = $ rootScope. $ New()' mit '$ scope: scope. $ New()' innerhalb von dort aufgerufen. Danach habe ich in 'LookupCtrl' einen neuen Bereich mit $ scope: scope erstellt. $ New()' – Sartaj

+8

@HomoSapien - können Sie Code mit Ihrer aktualisierten Lösung posten? – Shamoon

Verwandte Themen