こんにちは、プログラマのおぐらです。
前回のJasmineによるJavaScriptのテスト その2から1週間ほど空いてしまいましたが、今回もJasmineのチュートリアルをお送りします。
テストの事前準備と後始末
他のテスティングフレームワークと同様に、Jasmineにもテスト毎に事前準備と後始末を行う仕組みがあります。Jasmineでは、テスト準備のためにbeforeEach
メソッド、後始末のためにafterEach
メソッドが提供されています。
Jasmineのテストは、describe
メソッドに渡す無名関数内にbeforeEach
やit
メソッド呼び出しを記述し、さらにそれらに渡す無名関数の中で実際のテストコードを記述するというスタイルになっています。が、厳密な記述をしていくとだいぶ文章が読みづらくなってしまうため、以降の説明ではRSpecなどのフレームワークと同じように「describe
メソッドの中」、「it
メソッド内」と表記します。厳密さが気になる方は適宜読み替えてください。よろしくお願いします。
beforEachメソッド
describe
内に書かれた各it
メソッド呼び出しの前に毎回実行されるメソッドがbeforEach
メソッドです。前回、「最初のテスト」として以下のテストを作成しました。
これにbeforeEach
メソッドを追加したコードを以下に示します。
最初のテストで使用していたarr
変数をbeforeEach
メソッド内で初期化するようになりました。こうする事によって、arr
変数に対して複数のテスト(=it
メソッド)を追加していった場合でも、共通する初期化処理を1箇所にまとめることができます。
では、具体例を見てみましょう。
ここでは、Array
クラスのshift
メソッドに対するテストを追加しました。追加したテストの内容は、
shift
メソッドの返り値が配列の先頭要素の1
であるshift
メソッド実行後のArray
オブジェクトの先頭要素が2
に変わっている
というものです。
では実行してみましょう。
追加したテストも意図どおりに動作しているようです。
今回の例では、それぞれのit
メソッド間で共有しているarr
変数の内容を、新たに追加した「shift
メソッドにより配列の先頭要素を取り出す事ができる」で変更していますが、既存の「length
プロパティで配列長を取得する事ができる」の結果には影響していません。これは、it
メソッドが実行される前にbeforeEach
メソッドが毎回実行され、beforeEach
メソッド内のarr = [1, 2, 3];
という箇所で、毎回arr
変数が初期化されているためです。
afterEachメソッド
beforeEach
メソッドとは逆に、describe
内の各it
メソッドが実行された直後に毎回実行されるのがafterEach
メソッドです。たいていの場合はbeforeEach
メソッドによる初期化処理のみで事足りますが、明確に後始末を行う必要がある場合にはこのメソッドを利用します。
例えばDOM操作を伴うテストの場合、beforeEach
メソッドで「document.body
にテスト用のDOM要素を追加する」という処理を行い、afterEach
メソッドでは「追加したDOM要素を削除する」という処理を書いておけば、テスト同士が影響しないようにすることができます。
次回に続きます。