2012-11-26 7 views
10

Wenn ich mit Mocha teste, habe ich oft eine Kombination aus sowohl asynchronen als auch synchronen Tests, die ausgeführt werden müssen.Wie kann Mocha warten und Timeout nur mit meinen asynchronen Tests?

Mocha behandelt dies schön, so dass ich einen Rückruf, done, angeben kann, wenn meine Tests asynchron sind.

Meine Frage ist, wie überwacht Mocha intern meine Tests und weiß, dass es auf asynchrone Aktivität warten sollte? Es scheint zu warten, wenn ich den Callback-Parameter in meinen Testfunktionen definiert habe. Sie können in den folgenden Beispielen sehen, der erste Test sollte Timeout, der zweite sollte fortfahren und beenden, bevor user.save die anonyme Funktion aufruft.

// 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; 
     }); 
    }) 
    }) 
}) 

Ist diese node.js spezifische Magie? Ist das etwas, das in jedem Javascript getan werden kann?

Antwort

18

Das ist einfach pure Magie Javascript.

Funktionen sind in der Tat Objekte, und sie haben Eigenschaften (wie die Anzahl der Parameter sind mit der Funktion definiert).

Blick auf, wie this.async in Mokka/lib gesetzt/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 Logik Änderungen basieren, ob Ihre Funktion mit Parametern definiert ist.

+0

Das ist richtig, mit dem genauen Beispiel. Sehen Sie sich die Antwort von George unten an, um die Dokumentation zur Längenfunktion für Funktionen zu sehen. –

2

Sie suchen nach der long-Eigenschaft von Function, die angeben kann, wie viele Argumente eine Funktion erwartet. Wenn Sie einen Callback mit done definieren, kann er es asynchron beschreiben und behandeln.

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

Danke, es sieht so aus [hier im Mocha-Quellcode] (https://github.com/visionmedia/mocha/blob/master/lib/runnable.js#L43). Und ein Beispiel für die Referenz, 'var fn1 = Funktion() {}; assert.equal (fn1.length, 0); var fn2 = Funktion (param) {}; assert.equal (fn2.length, 1)' –

Verwandte Themen