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, <Mustache> 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, <Mustache> world!');
TestSimple.done_testing();
というわけで、Perl と連携する必然性がなければ、v8 とかつかってやるのがいいとおもいます。連携する必要がある場合には、node.js と RPC するとかするのがいいんじゃないかな。
ただ、この方法には一つ欠点があって、heredoc がつかえないから、テンプレートエンジンが相手の場合はテストがかきづらいんですね。それはちょっと残念。coffee script つかえばいいんだけど、あれはちょっといろいろかえすぎ。javascript に python-like な """ による heredoc を処理するだけのラッパーとかかけてつかうのがいい気がする。
TAP をつかうと、テストするときに言語の壁を意識しなくていいので楽ですね。普通に prove で prove mustache-test.js とかするとテストできます。