简体   繁体   中英

Unit Testing AngularJS module controller

I'm looking at the TODO MVC AngularJS example, and I see the application is defined as a module.

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

Inside the controllers, I see them defined as:

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

My question deals with unit testing... how do I write a unit test for that class?

I've tried things like:

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
        });

    });
});

...but then "controller" ends up being null or undefined.

Do I need to modify the TODO MVC app so that the function passed to todomvc.controller() isn't anonymous?

Any direction would be appreciated as I'm very new to Angular.

You need to used the $controller service to unit test the controller.

Basically, you do something like this:

var scope, ctrl;

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

//use scope and ctrl as needed

See the example here: https://github.com/angular/angular-phonecat/blob/master/test/unit/controllersSpec.js#L18

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM