Jawaban:
Perbedaannya didokumentasikan di sana .
Tiga antarmuka menyajikan gaya yang berbeda dalam melakukan asersi. Pada akhirnya, mereka melakukan tugas yang sama. Beberapa pengguna lebih suka satu gaya daripada yang lain. Dikatakan demikian, ada juga beberapa pertimbangan teknis yang patut disoroti:
Antarmuka menegaskan dan mengharapkan tidak mengubah Object.prototype
, sedangkan seharusnya tidak. Jadi mereka adalah pilihan yang lebih baik di lingkungan di mana Anda tidak bisa atau tidak ingin berubah Object.prototype
.
Antarmuka menegaskan dan mengharapkan mendukung pesan khusus di mana-mana. Misalnya:
assert.isTrue(foo, "foo should be true");
expect(foo, "foo should be true").to.be.true;
Pesan "foo should be true" akan ditampilkan bersama dengan pernyataan yang gagal jika pernyataan tersebut gagal. Anda tidak mendapatkan kesempatan untuk mengatur pesan khusus dengan antarmuka yang seharusnya.
(Catatan historis: untuk waktu yang lama jawaban ini menyatakan bahwa untuk mendapatkan pesan khusus expect
, Anda harus menggunakan solusi. Aurélien Ribon memberi tahu saya bahwa meneruskan pesan expect
sebagai parameter kedua berfungsi. Konsekuensinya, tidak perlu untuk solusi. Saya tidak dapat menemukan versi Mocha mana yang mulai memberikan dukungan untuk pesan ini, dan saya juga tidak dapat menemukan versi dokumentasi yang mendokumentasikannya untuk pertama kali.)
Perhatikan bahwa assert.isTrue(foo)
, expect(foo).to.be.true
dan foo.should.be.true
semua keluaran berikut ini jika Anda tidak menggunakan pesan khusus, dan foo === 1
:
AssertionError: expected 1 to be true
Jadi, sementara antarmuka yang diharapkan dan harus lebih baik untuk dibaca , tidak seperti satu antarmuka lebih informatif daripada yang lain ketika pernyataan gagal. Pesan ini, yang identik untuk ketiga antarmuka, tidak memberi tahu Anda apa sebenarnya yang Anda uji, hanya bahwa nilai yang Anda peroleh adalah 1
tetapi yang Anda inginkan true
. Jika Anda ingin tahu apa yang Anda uji, Anda perlu menambahkan pesan.
expect
, menggunakan versi terbaru dari mocha
mocha
dan mendapatkan kegagalan pengujian.
Saya harap contoh sederhana ini membuat perbedaan mereka jelas
Menegaskan
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');
Dalam semua kasus, gaya tegas memungkinkan Anda untuk memasukkan pesan opsional sebagai parameter terakhir dalam pernyataan tegas. Ini akan dimasukkan dalam pesan kesalahan jika pernyataan Anda tidak lulus.
Catatan berharap dan harus menggunakan bahasa yang dapat di rantai untuk membangun pernyataan, tetapi mereka berbeda dalam cara pernyataan awalnya dibangun. Dalam hal harus, ada juga beberapa peringatan dan alat tambahan untuk mengatasi peringatan.
Mengharapkan
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);
Harapkan memungkinkan Anda untuk memasukkan pesan sewenang-wenang untuk menambahkan ke setiap pernyataan gagal yang mungkin terjadi.
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);
Ini berguna ketika digunakan dengan topik yang tidak deskriptif seperti boolean atau angka.
Sebaiknya
Gaya seharusnya memungkinkan untuk pernyataan rantai yang sama dengan antarmuka harapan, namun itu memperluas setiap objek dengan properti seharusnya untuk memulai rantai Anda. Gaya ini memiliki beberapa masalah ketika digunakan dengan Internet Explorer, jadi waspadai kompatibilitas browser.
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);
Perbedaan antara harapan dan seharusnya
Pertama-tama, perhatikan bahwa ekspektasi yang diperlukan hanyalah referensi ke fungsi yang diharapkan, sedangkan dengan yang diperlukan, fungsi tersebut sedang dieksekusi.
var chai = require('chai')
, expect = chai.expect
, should = chai.should();
The mengharapkan interface memberikan fungsi sebagai titik awal untuk chaining pernyataan bahasa Anda. Ia bekerja di node.js dan di semua browser.
The harus antarmuka meluas Object.prototype untuk memberikan getter tunggal sebagai titik awal untuk asersi bahasa Anda. Ia bekerja di node.js dan di semua browser modern kecuali Internet Explorer.
expect(foo).to.equal(true, "foo should be true");