Jaka jest różnica między Zarażenie i Zakażenie?

160

Jaka jest różnica między assert, expecta shouldi kiedy czego używać?

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

var foo = 'bar';

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

foo.should.equal('bar');
Manu
źródło

Odpowiedzi:

289

Różnice są tam udokumentowane .

Te trzy interfejsy przedstawiają różne style wykonywania asercji. Ostatecznie wykonują to samo zadanie. Niektórzy użytkownicy wolą jeden styl od drugiego. W związku z tym warto zwrócić uwagę na kilka kwestii technicznych:

  1. Interfejsy asertuj i oczekuj nie zmieniają się Object.prototype, podczas gdy powinno. Są więc lepszym wyborem w środowisku, w którym nie możesz lub nie chcesz się zmienić Object.prototype.

  2. Interfejsy asertuj i oczekuj obsługują komunikaty niestandardowe prawie wszędzie. Na przykład:

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

    Komunikat „foo powinno być prawdziwe” zostanie wyprowadzony razem z błędem asercji, jeśli nie powiedzie się. Nie masz możliwości ustawienia niestandardowej wiadomości za pomocą interfejsu powinien.

(Uwaga historyczna: przez długi czas ta odpowiedź wskazywała, że ​​aby otrzymać niestandardową wiadomość za pomocą expect, należałoby zastosować obejście. Aurélien Ribon poinformował mnie, że działa przekazywanie wiadomości do expectjako drugiego parametru. W związku z tym nie ma potrzeby obejście. Nie udało mi się znaleźć, która wersja Mocha zaczęła obsługiwać tę wiadomość, ani nie mogłem znaleźć wersji dokumentacji, która udokumentowała ją po raz pierwszy).

Należy zauważyć, że assert.isTrue(foo), expect(foo).to.be.truei foo.should.be.truewszystko co następuje wyjście, jeśli nie używać niestandardowy komunikat, i foo === 1:

    AssertionError: expected 1 to be true

Tak więc, chociaż interfejs oczekiwań i powinien być przyjemniejszy do czytania , to nie jest tak, że jeden interfejs zawiera więcej informacji niż drugi, gdy stwierdzenie zawodzi. Ta wiadomość, która jest identyczna dla wszystkich trzech interfejsów, nie mówi ci, co dokładnie testowałeś, tylko że otrzymałeś wartość, 1ale chciałeś true. Jeśli chcesz wiedzieć, co testowałeś, musisz dodać wiadomość.

Louis
źródło
8
Zauważ, że możesz także zrobićexpect(foo).to.equal(true, "foo should be true");
user5325596
Nie mogę wyświetlić żadnej niestandardowej wiadomości expect, używając najnowszej wersji mokki
Mirko
@Mirko Nie chodzi tu o wersję Mocha. Czy używasz najnowszej herbaty Chai?
Louis
To samo dotyczy projektu vanilla express (4.16.3), mocha (5.1.1), chai (4.1.2), chai-http (4.0.0). Komunikat niestandardowy nie pojawia się nigdzie, gdy jest uruchamiany z poleceniem mochai kończy się niepowodzeniem testu.
Juha Untinen
15

Mam nadzieję, że te proste przykłady wyjaśniają różnice między nimi

Zapewniać

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

We wszystkich przypadkach styl assert umożliwia dołączenie opcjonalnego komunikatu jako ostatniego parametru w instrukcji assert. Zostaną one uwzględnione w komunikatach o błędach, jeśli Twoje potwierdzenie nie przejdzie.

Zauważ, że oczekuj i powinien używać języka łańcuchowego do konstruowania asercji, ale różnią się one sposobem początkowego konstruowania asercji. W przypadku powinien istnieją również pewne zastrzeżenia i dodatkowe narzędzia do ich przezwyciężenia.

Oczekiwać

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

Oczekiwanie umożliwia dołączanie dowolnych wiadomości, które będą poprzedzać wszelkie nieudane potwierdzenia, które mogą wystąpić.

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

Jest to przydatne w przypadku tematów nieopisowych, takich jak wartości logiczne lub liczby.

Powinien

Styl powinien umożliwiać takie same asercje, które można łączyć w łańcuch, co interfejs oczekiwania, jednak rozszerza każdy obiekt o właściwość should, aby rozpocząć łańcuch. Ten styl ma pewne problemy, gdy jest używany w przeglądarce Internet Explorer, dlatego należy pamiętać o zgodności z przeglądarkami.

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

Różnice między oczekiwaniem a powinnością

Przede wszystkim zwróć uwagę, że oczekiwanie wymagają jest tylko odniesieniem do funkcji oczekiwania, podczas gdy w przypadku powinno wymagać, funkcja jest wykonywana.

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

Plik Oczekiwać interfejs zapewnia funkcję jako punkt wyjściowy do łączenia swoich twierdzeń językowych. Działa na node.js i we wszystkich przeglądarkach.

Powinny współpracować rozciąga Object.prototype celu zapewnienia jednolitego getter jako punkt wyjścia dla swoich twierdzeń językowych. Działa na node.js i we wszystkich nowoczesnych przeglądarkach z wyjątkiem Internet Explorera.

Adépòjù Olúwáségun
źródło