2013-03-08 7 views
5

私はTODO MVC AngularJSの例を見ています。アプリケーションはモジュールとして定義されています。私はそのクラスのユニットテストを書くのですか...単体テストとユニットテストAngularJSモジュールコントローラ

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

私の質問のお得な情報:コントローラ内部

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

は、私は彼らのように定義されて参照してください?

私はのようなもの試してみた:

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またはundefinedなってしまいます。

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

私はAngularにとって非常に新しいので、どんな方向にも感謝します。

答えて

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

+0

私は、おかげでそれをチェックアウトします! – arthurakay

+0

その例は大いに役立ちます...しかし、私はまだ "TodoCtrlは定義されていません"というエラーを受けます。これはTODO MVCのコントローラのコントローラを書き換える方法を変更する必要があると思いますあなたがリンクした例)。しかし、私は正しい道にあります、ありがとう! – arthurakay

+0

あなたの提案を使用した後、さらに調べるには、 "ctrl.addTodo()"の代わりに "scope.addTodo()"を使用する必要があります。ありがとう! – arthurakay

関連する問題