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, <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 とかするとテストできます。