expressで作ったHelloWorldをsupertestでテストする

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

今回は実装を作ってからテストしたけれど、テスト駆動開発にも役立ちそう。

Mac OS X と homebrew なら驚くほど簡単に node.js で HelloWorld

あっという間に動かせてしまった。

(1) Mac OS X にパッケージ管理 homebrew をインストールする。
$ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)"

(2) homebrew を使って node.js をインストールする。
$brew install node

(3) HelloWorldを出力するコードを書く。
コードは nodejs.org から引用。
$vi server.js

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

(4) node.js を実行する。
ブラウザでhttp://127.0.0.1:1337/を開くと Hello World と表示される。
$node server.js

便利だなぁ。
環境は以下の通り。
$sw_vers
ProductName: Mac OS X
ProductVersion: 10.7.5
BuildVersion: 11G63

補足
node.js と一緒にパッケージ管理 npm もインストールされる。
We recommend prepending the following path to your PATH environment
variable to have npm-installed binaries picked up:
/usr/local/share/npm/bin

とのことなので、
$vi ~/.bashrc
export PATH=$PATH:/usr/local/share/npm/bin
$source ~/.bashrc

としてあげる。

おまけ
node.js で使えるテストフレームワークはとても数が多い。
mocha(モカ)と should を使うなら、こんな感じ。
コードは mocha から引用。
$npm install mocha should
$mkdir test
$vi test/test.js

var should = require('should');

describe('Array', function () {
    describe('#indexOf()', function () {
        it('should return -1 when the value is not present', function () {
            [1, 2, 3].indexOf(5).should.equal(-1);
            [1, 2, 3].indexOf(0).should.equal(-1);
        });
    });
});


$node_modules/mocha/bin/mocha --reporter spec
Array
#indexOf()
✔ should return -1 when the value is not present

✔ 1 test complete (2 ms)