2012-11-26 15 views
10

私はMochaでテストしているときに、実行する必要のある非同期テストと同期テストの組み合わせをしばしば持っています。モカは私の非同期テストでのみ待機しタイムアウトを知っていますか?

私のテストが非同期であるときはいつも、モカはこれを美しく処理してコールバックdoneを指定することができます。

私の質問は、内部的に私のテストを観察し、それが非同期動作を待つべきことを知っていますか?テスト関数でコールバックパラメータが定義されているときは、いつでも待機するようです。以下の例では、最初のテストがタイムアウトする必要があります。user.saveが無名関数を呼び出す前に、2番目のテストが完了して終了する必要があります。

// 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でこれを行うことができるのでしょうか?

答えて

18

これは単純な純粋なJavascriptの魔法です。

関数は実際にはオブジェクトであり、プロパティを持っています(たとえば、関数の数がパラメータで定義されています)。 this.asyncはモカ/ 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; 
} 

モカのロジックの変更に設定されている方法で

ルック。

+0

これは正しい例です。関数の長さ関数に関するドキュメントを見るには、以下のGeorgeの答えを見てください。 –

2

あなたが探しているのは、関数の長さプロパティで、関数が何個の引数を期待しているかを示すことができます。 doneでコールバックを定義すると、それを非同期的に通知して処理することができます。

function it(str, cb){ 
    if(cb.length > 0) 
    //async 
    else 
    //sync 
} 

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/Length

+1

これはmochaのソースコード(https://github.com/visionmedia/mocha/blob/master/lib/runnable.js#L43)で行われているようです。 また、参照のための例は、 'var fn1 = function(){}; assert.equal(fn1.length、0); var fn2 = function(param){}; assert.equal –

関連する問題