JavaScript
mocha
chai

mocha / chai チートシート

More than 1 year has passed since last update.

概要

  • Mocha = jsのユニットテストツール

    • minitestなどに近いかたちでTDD/BDDが実現できる
    • Rails関連のmochaは、minitestのスタブ作成のためのツールなので別もの
  • Chai = アサーションツール

    • assert()系のメソッドを提供する
    • mochaはchaiを含む復数種のアサーションツールを選択して使える

導入

bower/npm/CDNなどからインストール可能。

bower
$ bower install mocha   #--save
$ bower install chai    #--save
npm
$ npm install mocha
$ npm install chai
CDN
<script src="https://cdnjs.cloudflare.com/ajax/libs/mocha/2.2.5/mocha.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/chai/3.0.0/chai.min.js"></script>

構築

コマンドラインあるいはブラウザベースで起動できる。

ブラウザからの利用

  • テスト用の画面に、mocha.jsおよびchai.jsを読み込む。
    (環境により任意)

  • div#mochaを、結果表示用の領域として準備する。

<div id="mocha"></div>
  • mochaを実行するためのjsコードを設定する
// 1. 起動する(BDDスタイル指定)
mocha.setup('bdd');

// 2. テストケースを記述する。あるいは一旦<script>を切って外部のテストファイルを読む
// ...

// 3. テストを実行
mocha.checkLeaks();
mocha.run();
  • テストケースを実装し、画面をブラウザ表示することで、テストを実行できる。

mocha::テストケースの書き方

テストケースはBDD, TDD, EXPORTS, QUNITなどの復数のスタイルを選択して記述できる。
(mocha.setup()で指定する)

BDD

ビヘイビア(= 振る舞い = 「xxはxxなときxxする(はず)」)単位でテストを記述する。

BDDの例
// describe()でテストを階層的に分類
describe('User', function(){

    describe('attributes', function(){

        // id()でテストケースを定義
        it('has attribute name', function(){

            // 実際のアサーション処理はchaiなどを使う
            // ...
        });

    });

    describe('ajax', function(){

        it('can save', function(done){

            // 非同期処理をテストしたい場合は、it()の引数にとったdone() を呼ぶことでテスト完了を知らせる
            User.save(function(){
                done();
            }));
        });
    );

});

chai::アサーションの書き方

Assertion, BDDの2種類の書き方ができる。
いずれも検証に失敗すると例外が発生し、結果としてmochaがテストの失敗を結果表示する。

Assertion

旧来のアサート形式によって検査する。

アサーションの例
// user.attrが{}であることを確認する
chai.assert.isObject(user.attr);

// user.attr.idの値が-1であることを確認する
chai.assert.propertyVal(user.attr, 'id', -1);

アサーションのはかなり多い。
まただいたいのメソッドには、その検証項目の否定形がある。
(equal()に対するnotEqual()など)

アサーションメソッド抜粋
isOk()              // true
deepEqual()         // 同値
isAbove()           // >
isAtLeast()         // >=
isBelow()           // <
isAtMost()          // <=
isTrue()            // == true
isFalse()           // == false
isNull()            // == null
isNaN()             // isNan()
isUndefined()       // === undefined
isFunction()        // instanceof Function
isObject()          // instanceof Object
isArray()           // instanceof Array
isString()          // instanceof String
isNumber()          // instanceof Number
isBoolean()         // instanceof Boolean
typeOf()            // typeof
instanceOf()        // instancef
include()           // ex. 'foobar' includes 'foo'
lengthOf()          // .length
match()             // RE

一覧は公式のリファレンスを参照のこと。

Except/Should

メソッドチェーンにより、英文のような形でBDD的な振る舞いを記述できる方法。

Except/Shouldの例
var foo = 'bar';

// expectで書く
expect(foo).to.be.a('string');

// shouldで書く
foo.should.be.a('string');

参考