2013-03-08 8 views
5

Ich schaue mir das TODO MVC AngularJS Beispiel, und ich sehe die Anwendung als ein Modul definiert ist.Unit Tests AngularJS-Modul-Controller

var todomvc = angular.module('todomvc', []); 

Innerhalb der Controller, ich sehe sie wie folgt definiert:

todomvc.controller('TodoCtrl', function TodoCtrl($scope, $location, todoStorage, filterFilter) { 
    //... 
}); 

Meine Frage beschäftigt sich mit Prüfeinheit ... wie kann ich einen Komponententest für diese Klasse schreiben?

Ich habe versucht, Dinge wie:

describe('TodoCtrl', function() { 
    var controller; 

    beforeEach(function() { 
     controller = todomvc.TodoCtrl; 
    }); 

    afterEach(function() { 
     controller = null; 
    }); 

    describe('addTodo() method', function() { 
     console.log(controller) 
     it('should do something', function() { 
      expect(typeof controller.addTodo).toBe(true); //should fail 
     }); 

    }); 
}); 

... aber dann "Controller" endet null oder nicht definiert ist.

Muss ich die TODO MVC App so ändern, dass die an übergebene Funktion todomvc.controller() nicht anonym ist?

Jede Richtung würde geschätzt werden, da ich Angular sehr neu bin.

Antwort

10

Sie müssen den $controller Service zum Testen des Controllers verwenden.

Im Grunde tun Sie etwas wie folgt aus:

var scope, ctrl; 

beforeEach(inject(function($rootScope, $controller) { 
    scope = $rootScope.$new(); 
    ctrl = $controller('TodoCtrl', {$scope: scope}); 
})); 

//use scope and ctrl as needed 

Siehe Beispiel hier: https://github.com/angular/angular-phonecat/blob/master/test/unit/controllersSpec.js#L18

+0

Ich werde das überprüfen, danke! – arthurakay

+0

Dieses Beispiel hilft sehr ... aber ich bekomme immer noch einen "TodoCtrl ist nicht definiert" -Fehler, der mich denken lässt, dass ich die Art und Weise ändern muss, in der der Controller im TODO MVC Beispiel geschrieben wird das Beispiel, das Sie verknüpft haben). Aber ich bin auf dem richtigen Weg, danke! – arthurakay

+0

Bei weiterer Überprüfung muss ich "scope.addTodo()" anstelle von "ctrl.addTodo()" verwenden, nachdem ich Ihren Vorschlag verwendet habe. Vielen Dank! – arthurakay