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!