AngularJS

【AngularJS, Jasmine】テストの書き方まとめ。

簡単なプロジェクトで練習してみたので自分用にまとめ直し。

  • まずはテスト用の簡単なプロジェクトを準備。ディレクトリ構成は下記の通り。

jasmineフォルダ以下はjasmine Standalone Distributionのファイル群。
testディレクトリ以下にテスト用のファイルを配置している。runner.htmlにアクセスすることでテストが実行される。
今回作成したAngularアプリケーションは、app.jsindex.htmlindexController.jsindexService.jsの4ファイルで構成。
それぞれのファイル内容は下記の通り。

app.js

index.html

indexController.js

indexService.js

index.htmlにアクセスすると画面にhello world.が表示される。見た目はそれでおしまいだが、テスト用に用意したサービスを実行しまくっているので、コンソールには色々と吐かれる。 これらをテストするためにトリガーファイルとなるrunner.htmlを用意する。

runner.html

index.htmlとの違いとして、angular.min.js本体を読み込んだ直後にangular-mocks.jsを読み込んでいる。8行目から14行目はjasmine本体のセットアップ処理なのでこれは必ず必要となる。

ここまでの設定が完了したら、実際にテストを記述していく。 今回はテスト本体をtest\controllers\indexControllerSpec.jsに配置した。

describe()メソッドでテストのセットを作成するようなイメージ。この中にある複数のit()メソッドがそれぞれのテスト内容となる。雰囲気はソースコード内のコメントアウトを参照。

indexControllerSpec.js

で実際runner.htmlにアクセスすると下記画像の通りテストが実行されて、結果を知らせてくれる。

意外と簡単にテストを作成することが出来た。リソースが絡んだテストなんかはまた次回。

【AngularJS】フォームを開いた際に自動でフォーカスさせるディレクティブ。

を見つけたのでメモ。

Javascript

HTML

うん。便利。

【AngularJS】コントローラー間で値を共有する方法いろいろ。

qiitaにいいまとめがあったのでペタリ。

http://qiita.com/sunny4381/items/aeae1e154346b5cf6009

個人的には$broadcast()を用いたアプローチもなかなか好き。

シンプルさならShared Serviceがおすすめ。

【AngularJS】resourceとng-initの関係。

テンプレートの中でng-initを使用する際、非同期で準備される値(以下、非同期変数)を用いてると、その値がセットされる前にng-initが実行されてしまうため、中身を正しく参照できないという問題が発覚。
要は通信中にinitされてしまうため、undefinedが参照されているような感じ。

しかし、ng-repeatにセットされた非同期変数に関してはループ内でng-initすると問題なく動作するようなので、ng-initとresourceを掛けあわせたい場合はresourceの返り値を配列にラップしてでもng-repeatを用いたほうが幸せになれる。

【AngularJS】複数のコントローラー間で値を共有する。

入れ子による継承やui-routerなどで親子関係になっているコントローラーに関していえば、子から親の変数を参照することは簡単にできる。が、親から子のプロパティを参照するのに手こずった。

解決方法としては双方のコントローラーに共通のサービスを注入しそのサービスが返却するオブジェクトを経由して値の共有を行うのがベターとのこと。下記例。

Javascript

HTML

これで片方のモデルを書き換えるともう片方のモデルにも変更が伝搬されるようになった。

【AngularJS】複数本の非同期通信が完了した後に処理を実行する方法。

$q.all()を用いる

AngularJSの$qはJavascriptのPromiseインターフェースを提供してくれるサービス。

$qdefer()メソッドを実行すると、Deferredオブジェクトを生成する事ができる。

このDefferedオブジェクトと$qサービス用いることで複数ある非同期通信の完了を検知することが出来るようになる。

各非同期通信処理関数は返り値としてPromiseオブジェクトを返却するように設計し、それを$q.all()メソッドでラップしてやればOK。

$qサービスはマジ便利過ぎて神がかってる。

$qに関する解説として下記ページも非常に参考になった。

http://dev.classmethod.jp/client-side/javascript/angularjs-q-promise/

【AngularJS】「WARNING Tried to Load Angular More Than Once」エラー。

ui-router利用時、WARNING: Tried to Load Angular More Than Onceというエラーが出てビューの表示がなんだかおかしくなった。

これは指定しているルーティングに対するテンプレートが存在しないため再帰的にデフォルトルーティングを読みに行ってしまっているために発生するエラーで、しっかりと対応するビューファイルを用意してやったら治った。

【AngularJS】$cookieStoreでcookieを扱う。

$cookieStoreとは

  • angularでcookieを扱うためのサービス。

Angular標準のngCookiesモジュールを読み込むことで利用可能。
単純にキーとバリューの保存庫のような感じなので使い方はめちゃくちゃ簡単。

使い方

  • 利用したいモジュールに$cookieStoreを注入する。

値を取得する。

値を保存する。

値を削除する。