power-doctestという doctest風 にコードと評価結果のコメントを並べるとテストとして実行出来るようなNode製を以前作りました。

評価したい式; // => 期待する評価結果

内部的にnodeのvmモジュールを使って、ASTを変換したコードを実行させていて非同期なコードに未対応でした。
(vmモジュールで非同期の対応とエラーハンドリングのやり方がわからなかった)

色々試してみたところ何とか動いたので、0.3.0から下記のような

gif

var array = [1, 2, 3, 4, 5];
setTimeout(function () {
    array;//=> [0, 2, 3, 4, 5]
}, 16);

上記のテスト結果は失敗するので、以下のようなエラーが表示されます。

Power doctest promised example  zsh 2014 03 22 23 34 12 2014 03 22 23 34 19

サンプルコードは以下においてあります。

実行はgulp plugin経由azu/gulp-power-doctestで行ってます。

vmモジュールのエラーハンドリング

vmモジュールは色々制限できるevalみたいな感じで、context(グローバル空間)も設定できるような感じのものです。

vmモジュール自体はエラーが起きた時に捉えるイベントとかはなくて、同期的なコードを実行する場合はtry-catchで捉えればよかったのですが、非同期コードだとそうは出来ません。

色々試したところは、Domainを使うと、vm経由の実行のエラーもキャッチできるようなので(これ仕様なのかな?)、これを使って非同期コードの実行も対応してます。

var d = domain.create();
var context = {};
d.on('error', function (error) {
    console.log("Error", error.message);
});
d.run(function () {
    vm.runInNewContext(code, context);
});

いっそ非同期前提にした方が楽な気がしたので、実行する部分も全体Promisesにしたりしています。

色々やったせいで大分黒魔術感が高まった感じがします(設計の失敗)