2016-11-15 1 views
0

Ich hatte ein kleines Problem, das mich stört .. Der folgende Code zeigt einen Async-Test, in diesem Test testen wir einen Code wir habe keine Kontrolle über (Blackbox für den Test, ich kann es ändern).Mocha, sollte - beim Testen von Async-Funktion, die Versprechen hat, Assertion Fehler sind leise

Der Blackbox-Code löst ein Ereignis aus, wenn es fertig ist, hört der Test dieses Ereignis ab und bestätigt die Daten.

Das Problem ist, wenn es einen Assertionsfehler gibt, Ausnahme wird geworfen und hustt durch die Versprechung Fehlerbehandler und nicht durch den Testrahmen, also wird die done Funktion nie ausgeführt und wir erhalten Zeitlimitfehler für diesen Test.

ist es einfach zu lösen, indem versuchen & fangen innerhalb der it() -Block, aber ist es eine gute Praxis zu versuchen IMMER & fangen in der it() Block? Bisher vertraute ich dem Test-Framework, um Ausnahmen zu behandeln

ein anderes Problem, ist, dass der Fehler ist still, es sei denn der Fang druckt es, und seit seiner Blackbox können wir nicht darauf zählen.

die Spitzen hier hat mir geholfen, es zu lösen, aber ich nicht wie die Lösungen: https://github.com/mochajs/mocha/issues/1128#issuecomment-40866763

es ist anders als andere ähnliche Fragen, weil in dem es() Block nicht wir jeden Hinweis auf ein Versprechen zum Gegenstand haben.

describe.only("test", function() { 

    var event; 

    // blackbox simulates a code we have no controler over 
    // inside this code we have a promise, when this promise resolves it triggers event 
    var blackbox = function() { 
    var promise = new Promise(function (resolve, reject) { 
     resolve(); 
    }); 

    promise.then(function() { 
     event(4); 
    }).catch(function (e) { 
     console.log(e); 
    }); 
    }; 

    it("async with blackbox promise", function (done) { 
    // this simulates event listenner, when the event is triggered the code executes 
    event = function (data) { 
     // this assertion works and everything is fine 
     data.should.be.equal(4); 
     // this assertion thrown exception that is being cought by the promise reject handler and 
     // isnt cought by the testing framework (chai/mocha) 
     data.should.be.equal(5); 
     // because the exception is thrown we never reach the done 
     done(); 
    }; 

    blackbox(); 

    }); 
}); 
+0

Ich glaube, Sie mischen sich ein wenig von Sachen. Gib immer deine Versprechen zurück, und wenn du das Versprechen hältst, brauchst du keinen Rückruf. Gib einfach alle Versprechen zurück, die du hast. – MarcoL

+0

Beachten Sie auch, dass Sie sich nicht selbst "fangen" müssen, wenn Sie möchten, dass 'Mokka' auf einem abgelehnten' Versprechen' scheitert. – MarcoL

+0

@MarcoL, dies ist nur ein Beispiel, da der Code blackboxed ist - ich habe keine Kontrolle darüber. es kann eine 3rd Party Lib/Abhängigkeit sein oder meinst du der Blackbox-Beispiel-Code ist falsch geschrieben? –

Antwort

1

Die Art und Weise Sie verspricht in mocha testen ist, dass Sie sie zurückbringen und lassen Sie es die Aufgabe entschieden tun, wenn oder nicht zum Scheitern verurteilt.

Der erste Schritt ist das Versprechen in Ihrer blackbox Funktion zu machen:

// blackbox simulates a code we have no controler over 
// inside this code we have a promise, when this promise resolves it triggers event 
var blackbox = function() { 
    var promise = new Promise(function (resolve, reject) { 
    resolve(); 
    }); 

    return promise.then(function() { 
    event(4); 
    }); 
    // do not catch here unless you want the test to not fail on error 
}; 

Lassen Sie uns jetzt den Testcode ändern Versprechen zu handhaben:

it("async with blackbox promise", function() { 
    // this simulates event listenner, when the event is triggered the code executes 
    event = function (data) { 
    // this assertion works and everything is fine 
    data.should.be.equal(4); 
    // this assertion thrown exception that is being cought by the promise reject handler 
    data.should.be.equal(5); 
    }; 
    // mocha will append a rejection handler to this promise here and fail if it gets called 
    return blackbox(); 

}); 
Verwandte Themen