Unit tests for JSX
いずれJSX web siteにも載せますが、JSXには非同期テストにも対応したユニットテスト・フレームワーク、test-case.jsxが標準で添付されています。t/lib/*.jsxはこのtest-case.jsxでテストされています。
使い方は以下のようにTestCaseを継承して、"test"で始まるメソッドを並べるというJUnit風のものになっています。
非同期テストを行う場合は、TestCase#async()のコールバックの中でテストを行い、AsyncContext#done()でテストの終了を通知するというインターフェイスになっています。
import "test-case.jsx"; import "timer.jsx"; class _Test extends TestCase { // synchrounous tests function testClearTimeout() : void { var id = Timer.setTimeout(function() : void { this.fail("setTimeout called after clearTimeout"); }, 1); Timer.clearTimeout(id); this.expect(id, "clearTimeout").toBe(id); } // asynchronous tests function testSetTimeout() : void { this.async(function(async : AsyncContext) : void { var to = 200; var t0 = Date.now(); Timer.setTimeout(function() : void { var t1 = Date.now(); this.expect(t1 - t0, "setTimeout 200 ms.").toBeGE(to - 50); async.done(); }, to); }, 1000); } }
このファイルをt/001.foo.jsxという名前で保存したとして、実行はjsx --test
と[https://metacpan.org/module/prove:title=prove]
コマンドを使います。
prove --exec "jsx --test" --ext .jsx
このproveへの引数は.provercに書いてしまってもいいでしょう。jsx-random-generatorでは実際にそうやっており、proveコマンドを単体で起動するだけでテストを行えるようになっています。
このjsx --test
はtest-case.jsxを前提としているわけではなく、他のテストフレームワークを使うこともできるのですが、その話はまた別のエントリで書こうと思います。
Enjoy testing!