こんにちは、プログラマのおぐらです。
前回の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要素を削除する」という処理を書いておけば、テスト同士が影響しないようにすることができます。
次回に続きます。