2013-04-16 25 views
7

私のanglejsプロジェクトのユニットテストを始めたいと思います。それはまっすぐ進むことではないが、私はそれが本当に難しいと思う。私はカルマとジャスミンを使用しています。私のルートとアプリの依存関係をテストするために、私は問題ありません。しかし、このような命令をどのようにテストしますか?ユニットテストのangularjsディレクティブ

angular.module('person.directives', []). 
directive("person", function() { 
return { 
    restrict: "E", 
    templateUrl: "person/views/person.html", 
    replace: true, 
    scope: { 
     myPerson: '=' 
    }, 
    link: function (scope, element, attrs) { 

    }   
} 

});

テンプレートが検出されたことをインスタンスでどのようにテストすればよいですか?ここで

+1

テスト指示文のビデオがあります。http://www.youtube.com/watch?v=rB5b67Cg6bc – Neil

答えて

15

が、あなたはスコープの変更およびイベントハンドラをシミュレートしてかどうかを確認し、をコンパイルしに要素を公開し、それはスコープだ、を作成するには、beforeEachを使用して、基本的にhttps://github.com/vojtajina/ng-directive-testing

を移動するための方法でありますコードは要素とスコープを適切に反応させて更新します。ここには非常に簡単な例があります。

この仮定:私たちは、ユーザが指示を持つ要素をクリックしたときに、myPersonプロパティがclickedなることを期待

scope: { 
    myPerson: '=' 
}, 
link: function(scope, element, attr) { 
    element.bind('click', function() {console.log('testes'); 
    scope.$apply('myPerson = "clicked"'); 
    }); 
}   

を。これはテストする必要がある動作です。だから我々は、すべての仕様に(要素にバインドされた)コンパイルディレクティブを公開:

var elm, $scope; 

beforeEach(module('myModule')); 

beforeEach(inject(function($rootScope, $compile) { 
    $scope = $rootScope.$new(); 
    elm = angular.element('<div t my-person="outsideModel"></div>'); 
    $compile(elm)($scope); 
})); 

次に、あなたはちょうどそれを主張:

it('should say hallo to the World', function() { 
    expect($scope.outsideModel).toBeUndefined(); // scope starts undefined 
    elm.click(); // but on click 
    expect($scope.outsideModel).toBe('clicked'); // it become clicked 
}); 

Plnker hereclick()をシミュレートするには、このテストにjQueryが必要です。

+5

テンプレートのhtmlは$ templateCacheに動的に読み込みます。あなただけconf.jsであなたのファイルへのプリプロセッサは、= {「html2js」 「* .htmlを」} 同様 をファイル「.htmlのは、*」これは、テンプレートを追加することに帰着html2jsカルマプリプロセッサ を使用することができます; あなたのjsテストファイルにhtmlをモジュールとして指定してください – Lior

関連する問題