Der folgende Test verhält sich merkwürdig:
it('Should return the exchange rates for btc_ltc', function(done) {
var pair = 'btc_ltc';
shapeshift.getRate(pair)
.then(function(data){
expect(data.pair).to.equal(pair);
expect(data.rate).to.have.length(400);
done();
})
.catch(function(err){
//this should really be `.catch` for a failed request, but
//instead it looks like chai is picking this up when a test fails
done(err);
})
});
Wie soll ich mit einem abgelehnten Versprechen richtig umgehen (und es testen)?
Wie soll ich mit einem fehlgeschlagenen Test richtig umgehen (dh : expect(data.rate).to.have.length(400);
?
Hier ist die Implementierung, die ich teste:
var requestp = require('request-promise');
var shapeshift = module.exports = {};
var url = 'http://shapeshift.io';
shapeshift.getRate = function(pair){
return requestp({
url: url + '/rate/' + pair,
json: true
});
};
Ensure the done() callback is being called in this test
Beim Versuch, dies mit Mokka 2.2.5 zu tun , wird eine Fehlermeldung angezeigt.done
Parameter in dasit
, der sich dagegen entscheiden würde.done
in meinemit
Rückruf und expliziten Aufrufsreturn
(auf das Versprechen) im Rückruf habe ich es zum Laufen gebracht, genau wie im Code-Snippet.Alternately, instead of using the done() callback, you may return a Promise. This is useful if the APIs you are testing return promises instead of taking callbacks:
done
Parameter an denit
Aufruf, und dies geschieht immer noch ...Wie bereits erwähnt hier sind die neueren Versionen von Mokka bereits Versprechen-aware. Da das OP jedoch speziell nach Chai gefragt hat, ist es nur fair, auf das
chai-as-promised
Paket hinzuweisen, das eine saubere Syntax zum Testen von Versprechungen bietet:mit Chai-wie versprochen
So können Sie Chai-as-versprochen verwenden, um sowohl Fälle
resolve
als auchreject
Fälle für ein Versprechen zu testen :ohne Chai-wie versprochen
Um wirklich klar zu machen, was getestet wird, hier das gleiche Beispiel, das ohne versprochenes Chai codiert wurde:
quelle
catch
aufgerufen wird, wenn einer derexpect(s)
Fehler auftritt. Dies erweckt den falschen Eindruck, dass das Versprechen fehlgeschlagen ist, obwohl dies nicht der Fall war. Es ist nur die Erwartung, die fehlgeschlagen ist.Chai.use
, um es zu besteigen. Ich hätte das nie aus den Unterlagen aufgegriffen, die sie hatten. | :(Hier ist meine Einstellung:
async/await
Eine verzögerte Versprechensfunktion, die bei einer Verzögerung von 0 fehlschlägt:
Positiver Test ist ziemlich einfach. Ein unerwarteter Fehler (simulieren mit
500→0
) schlägt den Test automatisch fehl, da das abgelehnte Versprechen eskaliert.Negativer Test verwendet die Try-Catch-Idee. Allerdings: "Beschweren" über einen unerwünschten Pass erfolgt erst nach der catch-Klausel (auf diese Weise endet es nicht in der catch () -Klausel und löst weitere, aber irreführende Fehler aus.
Damit diese Strategie funktioniert, muss der Test aus der catch-Klausel zurückgegeben werden. Wenn Sie nichts anderes testen möchten, verwenden Sie einen anderen it () - Block.
quelle
Es ist eine bessere Lösung. Geben Sie einfach den Fehler mit done in einem catch-Block zurück.
Dieser Test schlägt mit der folgenden Meldung fehl:
AssertionError: expected 1 to equal 11
quelle