Odpowiedzi:
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:
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
.
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 expect
jako 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.true
i foo.should.be.true
wszystko 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ść, 1
ale chciałeś true
. Jeśli chcesz wiedzieć, co testowałeś, musisz dodać wiadomość.
expect
, używając najnowszej wersji mokki
mocha
i kończy się niepowodzeniem testu.
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.
expect(foo).to.equal(true, "foo should be true");