AngularのUnitTestをjasmineで行ってみました。
環境としては、前回の
【jasmine + Karma】 による javascript 単体テストをしてみた
をベースとして、これにAngularJsを追加していこうと思います。
前回からの変更内容
AngularJs と angular-mocks をPackage.jsonに追加します。
注意)
angular-mock ではなくて、 angular-mocks 複数形なのに注意してください。
始め、angular-mockというものをnpm installしてしまい、ハマってしまったので共有します。
+ "dependencies": {
+ "angular": "^1.6.1",
+ "angular-mocks": "^1.6.1"
+ }
Karmaで読み込むJSファイルにangularライブラリを追加します。
files: [
+ "node_modules/angular/angular.js",
+ "node_modules/angular-mocks/angular-mocks.js",
"src/script/js/*.js",
"spec/*.js"
],
これで準備がととにましたので、次にプロダクトコードを作成していきます。
プロダクトコードの作成
プロダクトコードは、demoAngular.jsとし、簡単なcontrollerとfilterを作成します。
テストは、このcontrollerとfilterについて行うことにします。
filterは、既存のnumberFilterを拡張したものを作成しました。
値が、0以上の時は既存のfilterを適応、それ以外は"-"となるようなfilterとなっています。
angular.module('demoApp', [])
.controller('demoAppCtl', ['$scope', function($scope) {
$scope.name = "angular-unit-test";
$scope.demoFunction = function(num) {
return num * num;
};
}])
.filter('numberCustomFilter', ['$filter', function ($filter) {
return function (num) {
if (num != null) {
if (num >= 0) {
return $filter('number')(num);
}
}
return "-";
}
}]);
テストコードの作成
Angularの単体テストの場合は、まず、angular.moduleをloadを行します。
// load the angular module
beforeEach(module('demoApp'));
Controllerのテストコードを作成
DIのMock化を行う
Directiveについては、inject() でmock化します。
各ケースで共有してcontrollerのmockを使用するので、beforeEachでcontrollerのmock化を行います。
// inject angular directive
beforeEach(inject(function(_$rootScope_, _$controller_) {
var rootScope = _$rootScope_;
$scope = rootScope.$new();
$controller = _$controller_;
// $controller('コントローラ名', { injectしているDirective: mock化したDirective変数名} )
demoAppCtl = $controller('demoAppCtl', { $scope: $scope });
}));
テストケースの作成
Controllerで定義した$scopeのパラメータと関数についてテストケースを以下のように作成します。
it('$scope パラメータ テスト', function() {
expect($scope.name).toEqual("angular-unit-test");
});
it('demoFunction テスト', function() {
expect( $scope.demoFunction(3) ).toEqual(9);
});
テスト実施
demoAngularUnitTest
controller test
✓ $scope パラメータ テスト
✓ demoFunction テスト
おわりに
カスタムフィルターについての単体テストも作成しましたが、やり方はcontorllerと同じなので省略します。
ソースをgithub上に公開しているのでそちらを見てください。