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();
});
});
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
Beachten Sie auch, dass Sie sich nicht selbst "fangen" müssen, wenn Sie möchten, dass 'Mokka' auf einem abgelehnten' Versprechen' scheitert. – MarcoL
@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? –