node.jsのためのWebアプリケーションフレームワークexpress。主にURLルーティングのテストには supertest が便利。
(1) expressでHelloWorld
express の Getting started に従って、HelloWorldを表示するWebアプリを作ってみる。
$npm install express
$vi app.js
var express = require('express'), app = express(); app.get('/hello.txt', function (req, res) { res.send('Hello World'); }); app.listen(3000, '0.0.0.0');
$node app.js
app#send を使うと、Content-Length を自動的に追加してくれる。
ブラウザから http://localhost:3000/hello.txt にアクセスすると、Hello World と表示される。
(2) mocha と supertest でテストを書く
mocha は単体テストのためのフレームワーク。supertest と組み合わせて使うことで、express で作った Web アプリの動作を、HTTPリクエストレベルで確認できる。
はじめに、単体テストができるように app.js を修正しておく。
var express = require('express'), app = express(); app.get('/hello.txt', function (req, res) { res.send('Hello World'); }); module.exports = app; if (!module.parent) { app.listen(3000, '0.0.0.0'); }
8行目で単体テスト側からWebアプリのロジックにアクセスできるよう、エクスポートしている。
10行目は単体テスト経由でWebアプリを動作させている場合には listen させないようにしている(単体テスト経由の場合 module.parent に値が入る)。
次に単体テスト側を準備する。
mocha はインストール済み($npm install mocha)だと手順は次の通り。
$npm install supertest
$mkdir test
$vi test/test_app.js
var request = require('supertest'); var app = require('../app'); describe('helloworld', function () { it('should return 200 with Content-Length', function () { var expected_body = 'Hello World'; request(app) .get('/hello.txt') .expect('Content-Length', expected_body.length) .expect(200) .end(function (err, res) { if (err) { throw err; } }); }); });
$node_modules/mocha/bin/mocha --reporter spec
今回は実装を作ってからテストしたけれど、テスト駆動開発にも役立ちそう。