Chai: wie man mit der ‘sollte’-Syntax auf undefiniert testet
Lesezeit: 3 Minuten
Aufbauend auf Dies Tutorial zum Testen einer Angularjs-App mit Chai möchte ich einen Test für einen undefinierten Wert mit dem Stil “sollte” hinzufügen. Das schlägt fehl:
it ('cannot play outside the board', function() {
scope.play(10).should.be.undefined;
});
mit Fehler “TypeError: Cannot read property ‘should’ of undefined”, aber der Test wird mit dem “expect”-Stil bestanden:
it ('cannot play outside the board', function() {
chai.expect(scope.play(10)).to.be.undefined;
});
Wie kann ich es mit “sollte” zum Laufen bringen?
Es ist einfach, wenn Sie “assert” verwenden, können Sie es so machen assert.isUndefined(scope.play(10))
– Lukaserat
15. November 2016 um 8:14 Uhr
Ich mag keine der Antworten hier, also habe ich einfach mitgemacht expect für undefinierte Schecks, should für alles andere 🤷
– Kipp
3. Februar um 16:06 Uhr
Dies ist einer der Nachteile der should-Syntax. Es funktioniert, indem allen Objekten die Eigenschaft should hinzugefügt wird, aber wenn ein Rückgabewert oder Variablenwert nicht definiert ist, gibt es kein Objekt, das die Eigenschaft enthält.
Das Dokumentation gibt einige Problemumgehungen, zum Beispiel:
var should = require('chai').should();
db.get(1234, function (err, doc) {
should.not.exist(err);
should.exist(doc);
doc.should.be.an('object');
});
should.not.exist wird validieren, ob der Wert ist null diese Antwort ist also nicht richtig. @daniel hat die folgende Antwort: should.equal(testedValue, undefined);. Das sollte die akzeptierte Antwort sein.
– Sebastian
23. April 2015 um 18:02 Uhr
Ich komme monatlich zu dieser Antwort (nicht die Dokumente 🙈) 🙂
– Ralf Cowling
23. November 2016 um 7:24 Uhr
should.equal(testedValue, undefined);
wie in der Chai-Dokumentation erwähnt
omg, was gibt es zu erklären? Sie erwarten TestedValue === undefined, also testen Sie es. Viele Entwickler setzen zuerst den getesteten Wert und verketten ihn dann mit “sollte” und es endet mit einem Fehler …
– Daniel
21. Mai 2014 um 14:02 Uhr
Dies funktioniert nicht out of the box und es wird nicht in gefunden die API-Dokumentation für .equal(). Ich kann verstehen, warum @OurManInBananas um eine Erklärung gebeten hat. Es ist eine unerwartete Verwendung von should als Funktion, die zwei Argumente akzeptiert, anstatt dass die erwartete verkettete Methodenform ein einzelnes Argument für den erwarteten Wert akzeptiert. Sie können dies nur erreichen, indem Sie eine aufgerufene Version von importieren/anfordern und zuweisen .should() wie in der akzeptierten Antwort von @DavidNorman und in diesem beschrieben Dokumentation.
– Gfullam
30. September 2016 um 13:00 Uhr
Ich denke, das wirst du finden .equal -Syntax erzeugt viel bessere Fehlermeldungen, weil sie es Ihnen ermöglicht, Nachrichten auszugeben, die beschreibender sind, wenn Dinge fehlschlagen
Beachten Sie, dass die Verwendung dieser Syntax dazu führen kann, dass JavaScript den in Klammern gesetzten Ausdruck als Versuch interpretiert, die vorherige Zeile als Funktion aufzurufen (wenn Sie Zeilen nicht mit einem Semikolon beenden).
– bmacnaughton
13. Februar 2018 um 18:20 Uhr
EpokK
Versuche dies:
it ('cannot play outside the board', function() {
expect(scope.play(10)).to.be.undefined; // undefined
expect(scope.play(10)).to.not.be.undefined; // or not
});
Beachten Sie, dass die Verwendung dieser Syntax dazu führen kann, dass JavaScript den in Klammern gesetzten Ausdruck als Versuch interpretiert, die vorherige Zeile als Funktion aufzurufen (wenn Sie Zeilen nicht mit einem Semikolon beenden).
– bmacnaughton
13. Februar 2018 um 18:20 Uhr
Jarowi
Vergessen Sie nicht eine Kombination aus have und not Schlüsselwörter:
Es ist einfach, wenn Sie “assert” verwenden, können Sie es so machen
assert.isUndefined(scope.play(10))
– Lukaserat
15. November 2016 um 8:14 Uhr
Ich mag keine der Antworten hier, also habe ich einfach mitgemacht
expect
für undefinierte Schecks,should
für alles andere 🤷– Kipp
3. Februar um 16:06 Uhr