15

Mocha でテストしているとき、実行する必要がある非同期テストと同期テストの両方を組み合わせることがよくあります。

doneMocha はこれを見事に処理し、テストが非同期のときはいつでもコールバックを指定できるようにします。

私の質問は、Mocha はどのようにして私のテストを内部的に監視し、非同期アクティビティを待機する必要があることを認識しているのかということです。テスト関数で定義されたコールバック パラメータがあるときはいつでも待機しているようです。以下の例でわかるように、最初のテストはタイムアウトし、2 番目のテストは続行しuser.saveて無名関数を呼び出す前に終了する必要があります。

// In an async test that doesn't call done, mocha will timeout.
describe('User', function(){
  describe('#save()', function(){
    it('should save without error', function(done){
      var user = new User('Luna');
      user.save(function(err){
        if (err) throw err;
      });
    })
  })
})

// The same test without done will proceed without timing out.
describe('User', function(){
  describe('#save()', function(){
    it('should save without error', function(){
      var user = new User('Luna');
      user.save(function(err){
        if (err) throw err;
      });
    })
  })
})

これはnode.js固有の魔法ですか? これはどのJavascriptでもできることですか?

4

2 に答える 2

22

これは単純な純粋な Javascript マジックです。

関数は実際にはオブジェクトであり、プロパティがあります (パラメーターの数が関数で定義されているなど)。

this.async が mocha/lib/runnable.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;
}

Mocha のロジックは、関数がパラメーターで定義されているかどうかに基づいて変化します。

于 2012-11-26T18:10:25.003 に答える