power-doctestが非同期テストに対応しました
power-doctestという doctest風 にコードと評価結果のコメントを並べるとテストとして実行出来るようなNode製を以前作りました。
評価したい式; // => 期待する評価結果
内部的にnodeのvmモジュールを使って、ASTを変換したコードを実行させていて非同期なコードに未対応でした。
(vmモジュールで非同期の対応とエラーハンドリングのやり方がわからなかった)
色々試してみたところ何とか動いたので、0.3.0から下記のような
var array = [1, 2, 3, 4, 5];
setTimeout(function () {
array;//=> [0, 2, 3, 4, 5]
}, 16);
上記のテスト結果は失敗するので、以下のようなエラーが表示されます。
サンプルコードは以下においてあります。
実行は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にしたりしています。
色々やったせいで大分黒魔術感が高まった感じがします(設計の失敗)
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。