#Mochaとは
公式サイトによると、Mocha(モカ)とは以下のようなものらしいです。
Mochaは、豊富な機能を持つJavaScriptのテストフレームワークであり、Node.jsおよびブラウザーで実行されます。また、非同期処理のテストも簡単に行えます。Mochaによるテストは連続して実行されるため、対処できていない例外処理も抜け漏れなくテストすることができ、柔軟で正確なレポートを作成できます。
引用・参考:Mocha公式
私の勉強不足のため、よくわかりませんが、すごいテストフレームワークということに間違いないようです。
それでは公式サイトに沿って使っていきましょう。
Node.jsのインストールが完了していることが前提です。
#Mochaでテストをしてみる
まずは、コンソールにて以下のように入力していきます。
$ mkdir test
$ cd test
$ npm init
$ npm install mocha
$ touch test.js
・1行目でtestと言う名のディレクトリを作成しています。
・2行目でtestディレクトリに移動しています。
・3行目でpackage.jsonを生成しています。
・4行目でmochaをインストールしています。
・5行目でtestディレクトリ内にtest.jsというファイルを作成しています。
続いて、test.js内にmochaの公式の書き方に沿って、テストを記述していきます。
const assert = require('assert');
describe('Array', () => {
describe('#indexOf()', () => {
it('指定された値が見つからない場合は -1 を返します。', () => {
assert.equal([1, 2, 3].indexOf(4), -1);
});
});
});
・1行目でassertモジュールを読み込んでいます。
これはmocha自体にはアサーションという、プログラムの正当性をチェックする機能がないためです。
・2行目は、describe("テストの対象", () => { ... })を意味し、
第二引数に、テストの処理を無名関数として渡します。
つまり、「テストの対象」と「どういうテストを行うか」を宣言しています。
Arrayとは配列を意味し、配列をテストの対象とすることを意味しています。
・3行目も同じで、テストの対象とどういうテストを行うかを宣言しています。関数処理の場合は'#'とつけるのが良いようです。
indexOf()メソッドは引数に与えられた内容と同じ内容を持つ配列要素の内、最初のものの添字を返します。存在しない場合は -1 を返します。
今回は、ArrayとindexOf()をテストの対象としています。
説明を続けます。
・4行目は、it("テストの内容", () => { ... })
第一引数では、テストがどんなテストであるのかを記述し、第二引数は、それをテストするための関数を書いています。
・5行目は、assert.equal(テスト対象, 想定されるテスト結果)となります。
今回は、assert.equal([1, 2, 3].indexOf(4), -1)で
配列[1, 2, 3]の中に、4という数字が入っているはずがないので、-1という数字を返すことを想定しています。
これで、mochaのテストの記述が終わりました。
続いて、コンソールに戻り、以下を入力し、テストの実行を行います。
$ ./node_modules/mocha/bin/mocha
> Array
#indexOf()
✓ 指定された値が見つからない場合は -1 を返します。
1 passing (9ms)
./node_modules/mocha/bin/mochaはテストを実行するコマンドです。
テスト結果がうまくいったので、✓ 指定された値が見つからない場合は -1 を返します。という結果が出ました。
ただ、このままだとテストをするたびに長いコマンドを打たなくてはならず、面倒なので、
package.jsonでテストスクリプトを設定します。
"scripts": {
"test": "node_modules/mocha/bin/mocha"
}
これで簡単にtestが実行できるようになりました。
コンソールに戻り、以下のコマンドを実行します。
$ npm test
先ほどと同じ結果が表示されれば、完了です。
###beforeとafterでテストの前後に記述する
テストを実行する前後に実行する before/after 関数を設定することができます。すべてのitの前後で実行するするには、 beforeEach/afterEach を使います。
describe("test", function() {
before(() => alert("テストが実行される準備ができました"));
after(() => alert("テストの実行が完了しました"));
beforeEach(() => alert("テストが始まります"));
afterEach(() => alert("テストが終わります"));
it('test 1', () => alert(1));
it('test 2', () => alert(2));
});
結果は以下のようになります。
テストが実行される準備ができました (before)
テストが始まります (beforeEach)
1
テストが終わります (afterEach)
テストが始まります (beforeEach)
2
テストが終わります (afterEach)
テストの実行が完了しました (after)
以上になります。