5

TODO MVC AngularJS の例を見ていると、アプリケーションがモジュールとして定義されていることがわかります。

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

コントローラー内では、次のように定義されています。

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

私の質問は単体テストに関するものです...そのクラスの単体テストを作成するにはどうすればよいですか?

私は次のようなことを試しました:

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

    });
});

...しかし、「コントローラー」はnullまたは未定義になります。

todomvc.controller()に渡される関数が匿名にならないように、TODO MVC アプリを変更する必要がありますか?

私はAngularに非常に慣れていないので、どんな方向性でもありがたいです。

4

1 に答える 1

10

$controllerコントローラを単体テストするには、サービスを使用する必要があります。

基本的に、あなたはこのようなことをします:

var scope, ctrl;

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

//use scope and ctrl as needed

こちらの例をご覧ください:https ://github.com/angular/angular-phonecat/blob/master/test/unit/controllersSpec.js#L18

于 2013-03-08T21:13:05.797 に答える