Chai: Wie man mit der Soll-Syntax auf undefiniert testet


95

Aufbauend auf diesem Tutorial zum Testen einer AngularJS-App mit Chai möchte ich einen Test für einen undefinierten Wert mit dem "sollte" -Stil hinzufügen. Dies schlägt fehl:

it ('cannot play outside the board', function() {
  scope.play(10).should.be.undefined;
});

mit dem Fehler "TypeError: Die Eigenschaft 'sollte' von undefiniert kann nicht gelesen werden", aber der Test besteht den Stil "erwarten":

it ('cannot play outside the board', function() {
  chai.expect(scope.play(10)).to.be.undefined;
});

Wie kann ich es mit "sollte" zum Laufen bringen?


1
Es ist einfach, wenn Sie "assert" verwenden, können Sie es tun alsassert.isUndefined(scope.play(10))
lukaserat

Antworten:


80

Dies ist einer der Nachteile der Sollte-Syntax. Es funktioniert, indem allen Objekten die Eigenschaft should hinzugefügt wird. Wenn jedoch ein Rückgabewert oder ein Variablenwert undefiniert ist, gibt es kein Objekt, das die Eigenschaft enthält.

Die Dokumentation enthält 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');
});

14
should.not.existüberprüft, ob der Wert nullso ist, dass diese Antwort nicht korrekt ist. @ Daniel hat die Antwort unten : should.equal(testedValue, undefined);. Das sollte die akzeptierte Antwort sein.
Sebastian

7
Ich komme monatlich zu dieser Antwort (nicht zu den Dokumenten 🙈) :-)
Ralph Cowling

52
should.equal(testedValue, undefined);

wie in der Chai-Dokumentation erwähnt


12
omg, was gibt es zu erklären? Sie erwarten, dass getesteter Wert === undefiniert ist, also testen Sie ihn. Viele Entwickler setzen zuerst getestete Werte zuerst und verketten sie dann mit sollte und es endet mit einem Fehler ...
Daniel

5
Dies funktioniert nicht sofort und ist in der API-Dokumentation für nicht enthalten.equal() . Ich kann verstehen, warum @OurManInBananas um eine Erklärung gebeten hat. Es ist eine unerwartete Verwendung von sollte 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 / benötigen und zuweisen, .should()wie in der akzeptierten Antwort von @DavidNorman und in dieser Dokumentation beschrieben .
Gfullam

Ich denke, Sie werden feststellen, dass diese .equalSyntax viel bessere Fehlermeldungen erzeugt, da Sie damit Nachrichten ausgeben können, die
aussagekräftiger

17

Test auf undefiniert

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

Test auf Null

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

Test auf Falschheit, dh unter Bedingungen als falsch behandelt

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

Nicht besonders nützlich oder intuitiv, aber das ist klug!
Thebenedict

2
Nicht nützlich? Es ist die beste Antwort für undefinierte Tests im IMO-Stil von bdd, es muss jedoch ein anderes npm-Paket (das sollte-Paket) installiert werden, und ich denke nicht, dass es sich lohnt, ein anderes Paket nur dafür zu installieren. Eine großartige Antwort
Wagner Leonardi


8

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

target.should.be.undefined();

Ich habe die folgenden Lösungen 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 dies der richtige Weg ist, aber es funktioniert.

Laut Post von Ghost in Github


1
Es ist erwähnenswert, dass die Verwendung dieser Syntax dazu führen kann, dass JavaScript den Ausdruck in Klammern als Versuch interpretiert, die vorherige Zeile als Funktion aufzurufen (wenn Sie Zeilen nicht mit einem Semikolon beenden).
Bmacnaughton

5

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
});

Danke, aber genau das mache ich im zweiten Versuch oben. Ich würde gerne verstehen, wie es mit der Sollte- Syntax geht.
Thebenedict

1

Die Antwort von @ david-norman ist gemäß der Dokumentation korrekt. Ich hatte einige Probleme mit der Einrichtung und entschied mich stattdessen für Folgendes.

(typeof scope.play (10)). should.be.undefined;


typeofOperator gibt eine Zeichenfolge zurück ; so konnte diese Behauptung nicht weitergegeben werden; cuz'undefined' !== undefined
dNitro

1

Vergessen Sie nicht eine Kombination von haveund notSchlüsselwörtern:

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

0

Sie können Ihr Funktionsergebnis einschließen should()und auf einen Typ von "undefiniert" testen:

it ('cannot play outside the board', function() {
  should(scope.play(10)).be.type('undefined');
});
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.