[mocha] なぜ done を入れると非同期になるのか
2013年6月19日
mocha のテストは、it に渡すコールバック関数が引数を取るか否かで、
同期実行と非同期実行(正確な分類の名前は不明)が変わります。
同期実行と非同期実行(正確な分類の名前は不明)が変わります。
describe('doneの有無で同期非同期が変わる', function(){
it('同期実行', function(){
});
// こっちは done() が実行するまで終了しない
// 実行されないとテスト失敗になる
it('非同期実行', function(done){
setTimeout(function(){
done();
}, 1);
});
});
この場合だと、後者は done を仮引数に入れているので、
mocha 側で「非同期なテスト」と判別されています。
どーやってやっているの?
JS 上でどうやって判別しているのかわからなかったので、
ソースを見ると
ソースを見ると
function Runnable(title, fn) {
this.title = title;
this.fn = fn;
this.async = fn && fn.length; // ココ!
this.sync = ! this.async;
this._timeout = 2000;
this._slow = 75;
this.timedOut = false;
}
関数オブジェクト.length で判別しています
・・・って、そんなのあるのか!
Function.length
Function.length – JavaScript | MDN
これで、関数定義上の引数の数が取れるんすねー、なるほどですねー
蛇足: mocha + expect.js + Grunt のサンプル
実に簡単な jQuery プラグインを題材に勉強中です。
最終的には、この記事から RequireJS を抜いた構成にする予定です。
最終的には、この記事から RequireJS を抜いた構成にする予定です。
間違ってるとこがあったり、
学ぶのに良い記事やリポジトリがあったら、教えて頂けると有り難いです!