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

    – jcollum

    10. November 2016 um 16:57 Uhr

Benutzer-Avatar
Teddychan

(typeof scope.play(10)).should.equal('undefined');

Test auf undefiniert

var should = require('should');
...
should(scope.play(10)).be.undefined;

Auf null testen

var should = require('should');
...
should(scope.play(10)).be.null;

Test auf Falsy, dh unter Bedingungen als False behandelt

var should = require('should');
...
should(scope.play(10)).not.be.ok;

Ich hatte Mühe, die should-Anweisung für undefinierte Tests zu schreiben. Folgendes funktioniert nicht.

target.should.be.undefined();

Folgende Lösungen habe ich gefunden.

(target === undefined).should.be.true()

if kann es auch als Typprüfung schreiben

(typeof target).should.be.equal('undefined');

Ich bin mir nicht sicher, ob das oben genannte der richtige Weg ist, aber es funktioniert.

Laut Post von Ghost in Github

  • 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

Benutzer-Avatar
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

Benutzer-Avatar
Jarowi

Vergessen Sie nicht eine Kombination aus have und not Schlüsselwörter:

const chai = require('chai');
chai.should();
// ...
userData.should.not.have.property('passwordHash');

1200920cookie-checkChai: wie man mit der ‘sollte’-Syntax auf undefiniert testet

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy