tokuhirom's Blog

Testing JavaScript with node.js

http://d.hatena.ne.jp/gfx/20110206/1296979666

JavaScript のライブラリやアプリケーションなどを JE でテストしたりするのは、筋が悪いとかんじます。創りかけのものを創りかけのものでテストするのは、時間の無駄になりやすいからです。

最近では v8(の一ラッパーとしての node.js)やSpiderMonkey などが用意に手にはいるので、これを利用すればよろしい。CommonJS などというものもでてきており、最近ではサーバーサイドでのテストもかんたんになりつつあるだろうし

ということで、mustache.js をテストするスクリプトを以下にあげる。これは node.js でテストする場合です。JavaScript で簡易的な TAP Producer を実装してみたけども、これよりちゃんとしたものを誰か node-test-simple などとしてリリースしてくれるといいとおもう。

#!/usr/bin/env node
var sys = require('sys'),
    fs  = require('fs')
    ;
var TEST_COUNT = 0;

eval(fs.readFileSync('./mustache.js', 'utf8'));

is(Mustache.to_html("Hello, {{lang}} world!\n", { lang: "<Mustache>" }), 'Hello, &lt;Mustache&gt; world!');
done_testing();

function ok(thing, msg) {
    sys.print((x ? "ok" : "not ok") + " " + ++TEST_COUNT + (msg ? msg : "") + "\n");
}
function is(got, required, msg) {
    sys.print('' + (got === required ? "ok" : "not ok") + " " + (++TEST_COUNT) + (msg ? msg : "") + "\n");
}
function done_testing() {
    sys.print('' + TEST_COUNT + ".." + TEST_COUNT + "\n");
}

もし、node-test-simple 的なライブラリが用意されておれば以下のようにかけて、さらにすっきりすることでしょう。

#!/usr/bin/env node
var sys = require('sys'),
    fs  = require('fs'),
    TestSimple = require('test-simple)
    ;
var TEST_COUNT = 0;

eval(fs.readFileSync('./mustache.js', 'utf8'));

TestSimple.is(Mustache.to_html("Hello, {{lang}} world!\n", { lang: "<Mustache>" }), 'Hello, &lt;Mustache&gt; world!');
TestSimple.done_testing();

というわけで、Perl と連携する必然性がなければ、v8 とかつかってやるのがいいとおもいます。連携する必要がある場合には、node.js と RPC するとかするのがいいんじゃないかな。

ただ、この方法には一つ欠点があって、heredoc がつかえないから、テンプレートエンジンが相手の場合はテストがかきづらいんですね。それはちょっと残念。coffee script つかえばいいんだけど、あれはちょっといろいろかえすぎ。javascript に python-like な """ による heredoc を処理するだけのラッパーとかかけてつかうのがいい気がする。

TAP をつかうと、テストするときに言語の壁を意識しなくていいので楽ですね。普通に prove で prove mustache-test.js とかするとテストできます。