Ich habe Probleme damit, dass Chai's expect.to.throw
in einem Test für meine node.js-App funktioniert. Der Test schlägt bei dem ausgelösten Fehler immer wieder fehl, aber wenn ich den Testfall mit dem Versuch abfange, den abgefangenen Fehler abzufangen und zu bestätigen, funktioniert er.
Funktioniert expect.to.throw
nicht so wie ich es mir vorstelle oder so?
it('should throw an error if you try to get an undefined property', function (done) {
var params = { a: 'test', b: 'test', c: 'test' };
var model = new TestModel(MOCK_REQUEST, params);
// neither of these work
expect(model.get('z')).to.throw('Property does not exist in model schema.');
expect(model.get('z')).to.throw(new Error('Property does not exist in model schema.'));
// this works
try {
model.get('z');
}
catch(err) {
expect(err).to.eql(new Error('Property does not exist in model schema.'));
}
done();
});
Der Fehlschlag:
19 passing (25ms)
1 failing
1) Model Base should throw an error if you try to get an undefined property:
Error: Property does not exist in model schema.
quelle
model
Instanz hat eine Funktion namens get, die ich übergeben / aufgerufen habe.to.throw
Testen einer bestimmten Bedingung innerhalb einer Funktion zu sein, für die diese Funktion mit dem ungültigen Status / den ungültigen Argumenten aufgerufen werden muss. (Übrigens ... warum deeplinks nicht von chaijs.com tatsächlich deeplink?)Wie diese Antwort sagt , können Sie Ihren Code auch einfach in eine anonyme Funktion wie diese einschließen:
quelle
expect(function(){ model.get('z'); }).to.throw('Property does not exist in model schema.').notify(done);
da es keine Benachrichtigungsmethode gibt.catch (err) { expect(err).equal('Error message to be checked'); done(); }
this
innerhalb der aufzurufenden Funktion arbeiten. Dann.bind
ist der richtige Weg.Und wenn Sie bereits ES6 / ES2015 verwenden, können Sie auch eine Pfeilfunktion verwenden. Dies entspricht im Wesentlichen der Verwendung einer normalen anonymen Funktion, ist jedoch kürzer.
quelle
this
this
von dem Bereich, in dem sie erstellt wurden. Dies kann häufig von Vorteil sein, da keine manuellenbind
Funktionen für ihrthis
Objekt erforderlich sind .bind
und immer Bindung anthis
den übergeordneten Bereich. Meine Absicht in dem Kommentar war nur sicherzustellen, dass die Leser über einen möglichen Fall von Gruben informiert waren.Diese Frage enthält viele, viele Duplikate, einschließlich Fragen, in denen die Chai-Assertionsbibliothek nicht erwähnt wird. Hier sind die Grundlagen zusammengefasst:
Die Assertion muss die Funktion aufrufen, anstatt sie sofort auszuwerten.
Sie können mit einer beliebigen Assertionsbibliothek nach bestimmten Fehlern suchen:
Knoten
Sollte
Chai erwarten
Sie müssen Ausnahmen behandeln, die dem Test entkommen
Dies kann zunächst verwirrend aussehen. Wie beim Fahrradfahren "klickt" es für immer, sobald es klickt.
quelle
Beispiele aus doc ...;)
weil Sie sich auf den
this
Kontext verlassen:Sie müssen eine der folgenden Optionen verwenden:
binde den Kontext
quelle
Eine andere mögliche Implementierung, die umständlicher ist als die .bind () -Lösung, aber eine, die dabei hilft, den erwarteten Punkt () zu verdeutlichen, erfordert eine Funktion, die einen
this
Kontext für die abgedeckte Funktion bereitstellt. Sie könnencall()
z.expect(function() {model.get.call(model, 'z');}).to.throw('...');
quelle
Ich habe einen schönen Weg gefunden, um es zu umgehen:
Es ist viel besser lesbar als meine alte Version:
quelle