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

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

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中