テスト対象の関数がイベントベースの非同期関数で、あるイベント(ここでは"close"とします)が終わった後で何か値の検証をしたいって時に、今まで次のようなコードを書いていました。
it("should fire close", (done)=> hoge.on("close", ()=>{ expect(huga).to.equal("piyo"); }); });
これでも正常動作しているとテスト自体は問題無いんですが、expectでチェックしている項目がfailした時に、タイムアウトまで待たされる上に 落ちた場所も分かりません。
で、今まではテストにfailしたら、expectの前後にDEBUG printを入れてどのテストがfailなのか確認するところから作業してたんですが こんな感じでPromiseを使えば解決しました!!
it("should fire close", async ()=>{ await new Promise((resolve)=>{ hoge.on('close', resolve) }) expect(huga).to.equal("piyo"); });
やってることはただの手動Promisifyなんですが、なんかasyncテストはPromiseを返す関数のものと思い込んでてなかなか思いつけなかったのがちょっとくやしい・・・
ただし、この形でもイベントが発火しなかった時は相変わらずタイムアウト待ちになるんですが、少なくともどこのテストでfailしたか一発で分かるようになったし タイムアウトになるのはイベントが発火しなかった時だけなので、今までよりずいぶんfail後の原因調査が捗ります。