Angular test sample 1
js ってテストしにくいよねってことで今流行りの angular で unit test する。 最初なので、事細かに説明するつもりで書いてみる。
サンプルは以下から git clone してください。ソースと突き合わせながら見るといいかも。
https://github.com/Syati/angular-test-sample
準備
ubuntu
- node & npm
$ sudo apt-get install nodejs
$ sudo apt-get install npm
mac
- node & npm
$ brew install node
共通
- bower
$ sudo npm install -g bower
- karma
$ sudo npm install -g karma-cli
実施:サンプルを CLONE して TEST
github にサンプルを書いたので clone する。
$ git clone git@github.com:Syati/angular-test-sample.git
prj 依存環境を入れる
$ cd your_clone_path/angular-test-sample/controller/recipe1
$ npm install
test 実行する
$ npm test
以下のような出力で、テストが成功する。
WARN [karma]: Port 9876 in use
INFO [karma]: Karma v0.12.24 server started at http://localhost:9877/
INFO [launcher]: Starting browser PhantomJS
INFO [PhantomJS 1.9.8 (Linux)]: Connected on socket -9tnO3qPnHscs3zVjS4l with id 62869514
PhantomJS 1.9.8 (Linux): Executed 1 of 1 SUCCESS (0.038 secs / 0.007 secs)
説明
directory
recipe1
├── app
│ ├── bower_compornents #1 bower js lib install dir
│ ├── css
│ ├── index.html
│ ├── js
│ │ └── app.js #4 target js
│ └── test #2 test files
│ └── app.spec.js #4 test js
├── .bowerrc #1 bower install dir 設定
├── bower.json #1 bower install する js lib などの設定
├── karma.conf.js #3 angular のテスト設定
├── package.json #2 npm lib などの設定
└── node_modules #2 npm lib install dir
#1 bower
js のパッケージ(jqueryなど)を DL してくれる便利パッケージ。
$ bower init # コマンドで初期設定 bower.json を作成
$ bower install angular --save # または --save-dev
デフォルトは bower.json がある場所がインストール先になるので .bowerrc にインストール先を書いておく。 上記を実施することで以下のファイルを作成する。
- bower.json
.bowerrc
その他
- .gitignore に bower_components を入れておく(bower install でいつでも同じ環境を構築できるので)。
- bower のオプション –save または –save-dev を分けることで、本番用と開発用を分けることが出来る。
- bower install –production で –save-dev で入れたパッケージはインストールせずに済むのである。
- 参考
#2 npm
$ npm init
$ npm install jasmine --save-dev # または --save
上記を実施することで以下のファイルを作成する。
- package.json
- その他
- .gitignore に node_modules を入れておく(npm install でいつでも同じ環境を構築できるので)。
- npm のオプション –save または –save-dev を分けることで、本番用と開発用を分けることが出来る(bower と同様ですね)。
- npm install –production で –save-dev で入れたパッケージはインストールせずに済むのである。
- 今回は test 用しかないので –save-dev ですべてインストールする。
- package.json 内の scripts って便利
- 参考
#3 karma angular の unit test の設定
karma init # コマンドで初期設定 karma.conf.js を作成できる
今回特に意識する場所としては以下の通り。
- basePath
- 基準とするパスなので設定ファイルのある場所 ./ にする。
- files
- ここで必要な js lib と テストのターゲット js とテスト js を読み込ませてあげる。
- browsers
- init のデフォルトだと Chrome だが、テストするたびに Chrome が開くのは邪魔なので、PhantomJS にする。
- plugins
- jasmine を利用するために以下を追加する。
- karma-jasmine
- karma から PhantomJS を呼べるようにするために以下を追加する。
- karma-phantomjs-launcher
- jasmine を利用するために以下を追加する。
#4 test を書く
テストするうえで jasmine の理解は必須なので tutorial で勉強しておく。 index.html をローカルで開けばわかると思うが button click で ‘hello’ とでてくるだけのもの。 テストする js は app.js である。
テストコードにコメント付与した。
'use strict';
describe('Unit: app moudle ', function(){
var scope; # scope がどこからでも呼べるように定義しておく
beforeEach(function(){
angular.mock.module('app'); # モジュールのモックを作成する
});
describe('MainCtrl', function(){
# ここで DI する。今回は MainCtrl cotroller で GET, POST など何もしていないので
# $rootScope と $controller のみ
beforeEach(inject(function($rootScope, $controller){
scope = $rootScope.$new(); # scope を作成して、上記で定義した scope に代入する
# scope を渡してコントローラを作成する
# これで scope に controller 内に定義した sayHello 関数などが入る
$controller('MainCtrl', {'$scope': scope});
}));
it('sayHello', function(){
scope.sayHello();
# scope.message が 'hello' となっているかテスト
expect(scope.message).toBe('hello');
});
});
});
- その他
- angular.mock.module を利用するうえで、bower.json に記述のある angular-mocks は必要。
まとめ
controller のテストは意外と簡単。ただし、DI が増えてくるとハマるポイントも多くなってくるので、次はそんなサンプルを書いていくつもり。