読者です 読者をやめる 読者になる 読者になる

望月いちろうのREADME.md

書き溜めておいた技術記事や旅行記のバックアップです。

Chai と Mocha でNode.jsのテスト自動化をやってみる | Node.js

Node.js

テスト駆動開発(TDD)とその派生の振る舞い駆動開発(BDD)は最近では一般化しているように思えます。

今回はNode.jsでTDDとBDDを行うためにライブラリであるChaiを紹介したいと思います。

Chai

chaijs.com

チャイと呼びます。あのスパイシーなインドの甘いミルクティーが語源でしょう

導入するには

sudo npm install chai  

devDependenciesに追記します。

つまりは開発ステージで限定して利用するという意味です。

"devDependencies": {
  "chai": "*"
}

BDD

Chaiを利用したBDDの基本になるのは次の2つの要素です

  • expect
  • should

expectでは特定の型の値、あるいはある範囲の値を返して欲しいと言ったように、特定の変数に対する期待を指定します。 もし指定した条件に一致しなければテストは失敗になるわけです。

expectを読み込む

'use strict';

const chai = require('chai')
const expect = chai.expect;

例を挙げます。RESTful APIでJSON形式のレスポンスを返す特定のルーティングの対してのテストを実行したいとします。 例えば、GET /user は以下の条件を満たさないといけないとします。

  1. ユーザーのIDを入力する
  2. リクエストが成功する
  3. IDに対応するユーザー情報がレスポンスとして帰ってくる

それに加えて

  • 実際にjson形式でレスポンスが返ってくる
  • ユーザー名"name",メールアドレスがレスポンスの値に入っている必要がある

この条件を満たす様なテストを設定するにはHTTPリクエストを行わせる必要があります。 そのためにはchai-httpを導入する必要があります。

sudo npm install chai-http

chai-httpを実際に使用するにはchaiから読み込ませる必要があります。

chai.use(chaiHttp);

これでchaiからhttpリクエストが行える様になりました。

次に実際のテストの中身を記述します。

chaiの記述はパイプになっています。左側に処理した値が右側に渡される仕組みです。

今回実行するテストの順番をもう一度確認して見ましょう

  1. ローカルホストの3000にリクエスト(Expressアプリケーションが起動している)
  2. /userにリクエスト
  3. 返り値をexpectでテストする

テストコードを全てまとめると・・

'use strict';

const chai = require('chai')
const expect = chai.expect();
const chaiHttp = require('chai-http');

chai.use(chaiHttp);

chai.request('http://localhost:3000')
.get('/users?id=3a828a3b258')
.end((err, res)=>{ 
   expect(err).to.be.null;
   expect(res).to.have.status(200);
   expect(res).to.be.json;
   expect(res.body).to.have.property('name');
   expect(res.body).to.have.property('email');
});

これをtestディレクトリに配置します。

localhost:3000でREST APIを起動している状態でこれを起動します。

node test/test.js

もし何のエラーも発生しなければOKです。

もしテストが失敗すればAssertionErrorが発生します。

AssertionError: expected { Object (domain, _events, ...) } to have a property 'name'
...

mochaを使う

mochaを利用することで複数のテストを一括で処理することが簡単になります。

これは次回に紹介します。