Angularでは、Jasmine、Angular testing utilities、Karma、Protractorなどが推奨されるテストツールとなっています。Jasmineはテストフレームワークと言われるもので、アプリケーションのテストに必要な機能を備えています。Jasmineは、テストの実行環境から、アサーション、モックやスパイなど豊富な機能を備えているのが特徴でもあります。個人的にAngularを使うことになって、同時にテストを書く際にこのJasmineを使うことになりました。今回の記事では、テストを書く際によく使われるアサーションのMatcher(テストの評価条件を定義するメソッド)について使い方をまとめてみました。よかったら参考にしてみてください。
JasmineのMatchers一覧
Matcherは、テストの評価条件を定義するメソッドです。expect()メソッドにテストする値を定義し、Matcherにはテスト結果(期待する値)を定義し、expect(A).matcherのメソッド(B)の形で、それぞれの値を比較することでテストを行います。
以下はJasmineで用意されているMatcherの全メソッドです。Jasmine v2.6の公式ドキュメントを元にまとめています。書き方はそれほど難しくありません。使用例を見ていただければと思います。
expect(A).toBe(B)
概要
AがBと===(厳密等価)であることをexpectします
パラメータ
toBe(expected)
- @param {Object} 比較するための期待値
使用例
expect(A).toEqual(B)
概要
AがBと同値比較で等しいことをexpectします
パラメータ
使用例
expect(A).toBeCloseTo(B, C)
概要
AがBと与えられた少数桁数(C)まで一致していることをexpectします
パラメータ
toBeCloseTo(expected, [precision(opt)])
- @param {Object} 比較するための期待値
- @param {Number} チェックする小数点の数(デフォルト値: 2)
使用例
expect(A).toBeGreaterThan(B)
概要
AがBより大きいことをexpectします
パラメータ
toBeGreaterThan(expected)
- @param {Number} 比較するための期待値
使用例
expect(A).toBeGreaterThanOrEqual(B)
概要
AがBより大きいか、または等しいことをexpectします
パラメータ
toBeGreaterThanOrEqual(expected)
- @param {Number} 比較するための期待値
使用例
expect(A).toBeLessThan(B)
概要
AがBより小さいことをexpectします
パラメータ
toBeLessThan(expected)
- @param {Number} 比較するための期待値
使用例
expect(A).toBeLessThanOrEqual(B)
概要
AがBより小さいか、または等しいことをexpectします
パラメータ
toBeLessThanOrEqual(expected)
- @param {Number} 比較するための期待値
使用例
expect(A).toBeTruthy()
概要
Aがture(真)であることをexpectします
パラメータ
なし
使用例
expect(A).toBeFalsy()
概要
Aがfalse(偽)であることをexpectします
パラメータ
なし
使用例
expect(A).toBeNaN()
概要
AがNaNであること(非数)をexpectします
パラメータ
なし
使用例
expect(A).toBeNull()
概要
AがNullであることをexpectします
パラメータ
なし
使用例
expect(A).toBeDefined()
概要
Aが定義されていることをexpectします
パラメータ
なし
使用例
expect(A).toBeUndefined()
概要
Aがundefinedであることをexpectします
パラメータ
なし
使用例
expect(A).toContain(B)
概要
AがBを含んでいることをexpectします
パラメータ
使用例1
使用例2
expect(A).toMatch(B)
概要
AがBの正規表現にマッチしていることをexpectします
パラメータ
toMatch(expected)
- @param {RegExp / String} 文字列を探すための値
使用例1
使用例2
expect(A).toHaveBeenCalled()
概要
スパイAが呼び出されていることをexpectします
パラメータ
なし
使用例
expect(A).toHaveBeenCalledBefore(B)
概要
スパイAがスパイBより先に呼び出されていることをexpectします
パラメータ
toHaveBeenCalledBefore(expected)
- @param {Spy} 実際のスパイより後に呼び出される別のスパイ
使用例
expect(A).toHaveBeenCalledTimes(B)
概要
スパイAがBで指定された回数呼び出されていることをexpectします
パラメータ
toHaveBeenCalledTimes(expected)
- @param {Number} 期待する呼び出し数
使用例
expect(A).toHaveBeenCalledWith(B)
概要
スパイAがBに指定した引数で少なくとも1回呼び出されていることをexpectします
パラメータ
toHaveBeenCalledWith(expected)
- @param {Object} 期待する引数(繰り返し可能)
使用例
expect(A).toThrow(B)
概要
Aが(Bという)例外を投げることをexpectします
パラメータ
toThrow([expected(opt)])
- @param {Object} 投げられる値。指定しない場合は、何かが投げられたという事実だけをチェックする
使用例1
使用例2
expect(A).toThrowError(B, C)
概要
Aが(Bというエラー名で)(Cというメッセージ)のエラーを投げることをexpectします
パラメータ
toThrowError([expected(opt)], [message(opt)])
- @param {Error} ランタイムエラー時に投げられ、インスタンス化されるErrorコンストラクタ。指定しない場合は、Errorが指定される
- @param {RegExp | String} 投げられるエラーにセットされるべきメッセージ
使用例1
使用例2
使用例3
使用例4
使用例5
.notメソッドについて
Jasmineでは、.notメソッドが用意されていて、否定評価をすることができるようになっています。.notメソッドをつけてexpect()メソッドを呼び出し、matcherを呼び出すと、ネガティブにアサーションが評価されます。状況によっては、.notメソッドをつけた方が評価しやすい場合もあります。
使用例
まとめ
Angular CLIでAngularプロジェクトを作成すると、Jasmineが一緒にインストールされるので、Angularでテストを書く場合はJasmineは必須の知識となってきます。まずは、今回紹介したmatcherを覚えておけば、ある程度のテストには対応できるかと思います。その後にスパイやモックの使い方や、さまざまなテストケースに対応できる書き方を覚えていけばよいでしょう。
コメント