旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

[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 を抜いた構成にする予定です。

間違ってるとこがあったり、
学ぶのに良い記事やリポジトリがあったら、教えて頂けると有り難いです!