Apa perbedaan antara menegaskan, mengharapkan dan seharusnya dalam bahasa Chai?

161

Apa perbedaan antara assert, expectdan should, dan kapan harus menggunakan apa?

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

var foo = 'bar';

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

foo.should.equal('bar');
Manu
sumber

Jawaban:

289

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:

  1. 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.

  2. 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 expectsebagai 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.truedan foo.should.be.truesemua 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 1tetapi yang Anda inginkan true. Jika Anda ingin tahu apa yang Anda uji, Anda perlu menambahkan pesan.

Louis
sumber
8
Perhatikan bahwa Anda juga dapat melakukannyaexpect(foo).to.equal(true, "foo should be true");
user5325596
Saya tidak dapat menerima pesan khusus apa pun expect, menggunakan versi terbaru dari mocha
Mirko
@Mirko Versi Mocha bukanlah hal yang penting di sini. Apakah Anda menggunakan Chai terbaru?
Louis
Sama dengan saya, pada vanilla express (4.16.3), mocha (5.1.1), chai (4.1.2), chai-http (4.0.0) proyek. Pesan khusus tidak muncul di mana pun ketika dijalankan dengan perintah mochadan mendapatkan kegagalan pengujian.
Juha Untinen
15

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.

Adépòjù Olúwáségun
sumber