Was ist der Unterschied zwischen behaupten, erwarten und sollten in Chai?


159

Was ist der Unterschied zwischen assert, expectund should, und wenn das, was zu benutzen?

assert.equal(3, '3', '== coerces values to strings');

var foo = 'bar';

expect(foo).to.equal('bar');

foo.should.equal('bar');

Antworten:


288

Die Unterschiede sind dort dokumentiert .

Die drei Schnittstellen bieten unterschiedliche Arten der Ausführung von Behauptungen. Letztendlich erfüllen sie die gleiche Aufgabe. Einige Benutzer bevorzugen einen Stil gegenüber dem anderen. Abgesehen davon gibt es auch einige technische Überlegungen, die hervorgehoben werden sollten:

  1. Die Assert- und Expect-Schnittstellen werden nicht geändert Object.prototype, wohingegen dies der Fall sein sollte. Sie sind daher die bessere Wahl in einer Umgebung, in der Sie sich nicht ändern können oder wollen Object.prototype.

  2. Die Assert- und Expect-Schnittstellen unterstützen fast überall benutzerdefinierte Nachrichten. Zum Beispiel:

    assert.isTrue(foo, "foo should be true");
    expect(foo, "foo should be true").to.be.true;

    Die Meldung "foo sollte wahr sein" wird zusammen mit der fehlgeschlagenen Zusicherung ausgegeben, wenn die Zusicherung fehlschlägt. Sie haben nicht die Möglichkeit, eine benutzerdefinierte Nachricht mit der Sollte-Schnittstelle festzulegen.

(Historischer Hinweis: In dieser Antwort wurde lange Zeit angegeben, dass expectSie eine Problemumgehung verwenden müssen , um eine benutzerdefinierte Nachricht zu erhalten . Aurélien Ribon hat mich darüber informiert, dass eine Nachricht an weitergeleitet wirdexpect als zweiten Parameter funktioniert. Folglich ist dies nicht erforderlich Eine Problemumgehung. Ich konnte weder herausfinden, welche Version von Mocha diese Nachricht unterstützt, noch konnte ich herausfinden, welche Version der Dokumentation sie zum ersten Mal dokumentiert hat.)

Beachten Sie, dass assert.isTrue(foo), expect(foo).to.be.trueund foo.should.be.truealle Ausgaben der folgenden , wenn Sie nicht eine benutzerdefinierte Nachricht verwenden, und foo === 1:

    AssertionError: expected 1 to be true

Während die erwartete und zu erwartende Schnittstelle besser zu lesen ist , ist es nicht so, dass eine Schnittstelle natürlicher informativ ist als die andere, wenn eine Behauptung fehlschlägt. Diese Nachricht, die für alle drei Schnittstellen identisch ist, sagt Ihnen nicht, was genau Sie getestet haben, 1sondern nur, dass der Wert, den Sie erhalten haben, der war , den Sie wollten true. Wenn Sie wissen möchten, was Sie getestet haben, müssen Sie eine Nachricht hinzufügen.


8
Beachten Sie, dass Sie auch tun könnenexpect(foo).to.equal(true, "foo should be true");
user5325596

Ich kann keine benutzerdefinierte Nachricht erhalten expect, mit der die neueste Version von Mokka
Mirko

@Mirko Die Version von Mocha ist hier nicht kritisch. Verwenden Sie den neuesten Chai?
Louis

Gleiches gilt für mich bei einem Vanilla Express (4.16.3), Mokka (5.1.1), Chai (4.1.2), Chai-http (4.0.0) Projekt. Die benutzerdefinierte Nachricht wird nirgendwo angezeigt, wenn sie mit dem Befehl ausgeführt wird mochaund ein Testfehler auftritt .
Juha Untinen

15

Ich hoffe, diese einfachen Beispiele machen ihre Unterschiede deutlich

Behaupten

var assert = require('chai').assert
, foo = 'bar'
, beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };

assert.typeOf(foo, 'string'); // without optional message
assert.typeOf(foo, 'string', 'foo is a string'); // with optional message
assert.equal(foo, 'bar', 'foo equal `bar`');
assert.lengthOf(foo, 3, 'foo`s value has a length of 3');
assert.lengthOf(beverages.tea, 3, 'beverages has 3 types of tea');

In allen Fällen können Sie mit dem Assert-Stil eine optionale Nachricht als letzten Parameter in die Assert-Anweisung aufnehmen. Diese werden in die Fehlermeldungen aufgenommen, falls Ihre Behauptung nicht bestanden wird.

Beachten Sie, dass Sie erwarten und sollten eine verkettbare Sprache verwenden, um Zusicherungen zu erstellen. Sie unterscheiden sich jedoch in der Art und Weise, wie eine Zusicherung ursprünglich erstellt wird. Im Falle von sollte gibt es auch einige Vorbehalte und zusätzliche Werkzeuge, um die Vorbehalte zu überwinden.

Erwarten von

var expect = require('chai').expect
, foo = 'bar'
, beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };
expect(foo).to.be.a('string');
expect(foo).to.equal('bar');
expect(foo).to.have.lengthOf(3);
expect(beverages).to.have.property('tea').with.lengthOf(3);

Mit Expect können Sie beliebige Nachrichten einfügen, um fehlgeschlagenen Zusicherungen voranzukommen.

var answer = 43;

// AssertionError: expected 43 to equal 42.
expect(answer).to.equal(42);

// AssertionError: topic [answer]: expected 43 to equal 42.
expect(answer, 'topic [answer]').to.equal(42);

Dies ist praktisch, wenn es mit unbeschreiblichen Themen wie Booleschen Werten oder Zahlen verwendet wird.

Sollte

Der Should-Stil ermöglicht dieselben verkettbaren Zusicherungen wie die Expect-Schnittstelle, erweitert jedoch jedes Objekt mit einer Should-Eigenschaft, um Ihre Kette zu starten. Dieser Stil weist bei Verwendung mit Internet Explorer einige Probleme auf. Beachten Sie daher die Browserkompatibilität.

var should = require('chai').should() //actually call the function
, foo = 'bar'
, beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };

foo.should.be.a('string');
foo.should.equal('bar');
foo.should.have.lengthOf(3);
beverages.should.have.property('tea').with.lengthOf(3);

Unterschiede zwischen erwarten und sollten

Beachten Sie zunächst, dass die Erwartungsanforderung nur ein Verweis auf die Erwartungsfunktion ist, während die Funktion mit der Sollanforderung ausgeführt wird.

var chai = require('chai')
, expect = chai.expect
, should = chai.should();

Die Expect- Schnittstelle bietet eine Funktion als Ausgangspunkt für die Verkettung Ihrer Sprachbehauptungen. Es funktioniert auf node.js und in allen Browsern.

Die Should- Schnittstelle erweitert Object.prototype, um einen einzelnen Getter als Ausgangspunkt für Ihre Sprachzusicherungen bereitzustellen. Es funktioniert auf node.js und in allen modernen Browsern außer Internet Explorer.

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.