Sự khác biệt giữa khẳng định, mong đợi và nên ở Chai là gì?


159

Sự khác nhau giữa là gì assert, expectshould, và khi nào thì sử dụng những gì?

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

var foo = 'bar';

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

foo.should.equal('bar');

Câu trả lời:


288

Sự khác biệt được ghi lại ở đó .

Ba giao diện trình bày các phong cách khác nhau của việc xác nhận thực hiện. Cuối cùng, họ thực hiện cùng một nhiệm vụ. Một số người dùng thích một phong cách hơn các phong cách khác. Điều này đang được nói, cũng có một vài cân nhắc kỹ thuật đáng chú ý:

  1. Các giao diện khẳng định và mong đợi không sửa đổi Object.prototype, trong khi đó nên làm. Vì vậy, chúng là lựa chọn tốt hơn trong môi trường mà bạn không thể hoặc không muốn thay đổi Object.prototype.

  2. Các giao diện khẳng định và mong đợi hỗ trợ các thông điệp tùy chỉnh ở mọi nơi. Ví dụ:

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

    Thông báo "foo nên là true" sẽ được xuất cùng với xác nhận thất bại nếu xác nhận thất bại. Bạn không có cơ hội đặt thông báo tùy chỉnh với giao diện nên.

(Lịch sử lưu ý: trong một thời gian dài câu trả lời này nói rằng để có được một thông báo tùy chỉnh với expect, bạn sẽ phải sử dụng một cách giải quyết. Aurélien Ribon thông báo với tôi rằng đi một thông điệp tới expectnhư một công trình tham số thứ hai Do đó, không có nhu cầu. một cách giải quyết. Tôi không thể tìm thấy phiên bản Mocha nào đã bắt đầu cung cấp hỗ trợ cho thông báo này và tôi cũng không thể tìm thấy phiên bản tài liệu nào được ghi lại lần đầu tiên.)

Lưu ý rằng assert.isTrue(foo), expect(foo).to.be.truefoo.should.be.truetất cả các đầu ra sau đây nếu bạn không sử dụng một thông báo tùy chỉnh, và foo === 1:

    AssertionError: expected 1 to be true

Vì vậy, trong khi giao diện mong đợi và nên đọc tốt hơn , thì không giống như một giao diện có nhiều thông tin tự nhiên hơn giao diện kia khi một xác nhận thất bại. Thông báo này, giống hệt nhau cho cả ba giao diện, không cho bạn biết chính xác bạn đang kiểm tra cái gì , chỉ có giá trị bạn nhận được là 1nhưng bạn muốn true. Nếu bạn muốn biết những gì bạn đã thử nghiệm, bạn cần thêm một tin nhắn.


8
Lưu ý rằng bạn cũng có thể làmexpect(foo).to.equal(true, "foo should be true");
user5325596

Tôi không thể nhận được bất kỳ thông báo tùy chỉnh nào xuất hiện cùng expect, sử dụng phiên bản mới nhất của mocha
Mirko

@Mirko Phiên bản Mocha không phải là thứ quan trọng ở đây. Bạn đang sử dụng Chai mới nhất?
Louis

Tương tự đối với tôi, trên một dự án vanilla express (4.16.3), mocha (5.1.1), chai (4.1.2), chai-http (4.0.0). Thông báo tùy chỉnh không xuất hiện ở bất cứ đâu khi chạy bằng lệnh mochavà bị lỗi kiểm tra.
Juha Untinen

15

Tôi hy vọng ví dụ đơn giản này làm cho sự khác biệt của họ rõ ràng

Khẳng định

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

Trong mọi trường hợp, kiểu xác nhận cho phép bạn bao gồm một thông báo tùy chọn làm tham số cuối cùng trong câu lệnh khẳng định. Chúng sẽ được bao gồm trong các thông báo lỗi nếu xác nhận của bạn không vượt qua.

Lưu ý mong đợi và nên sử dụng ngôn ngữ có thể xâu chuỗi để xây dựng các xác nhận, nhưng chúng khác nhau về cách xây dựng một xác nhận ban đầu. Trong trường hợp nên, cũng có một số cảnh báo và các công cụ bổ sung để khắc phục các cảnh báo.

Chờ đợi

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

Mong đợi cho phép bạn bao gồm các tin nhắn tùy ý để trả trước bất kỳ xác nhận thất bại nào có thể xảy ra.

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

Điều này rất hữu ích khi được sử dụng với các chủ đề không mô tả như booleans hoặc số.

Nên

Kiểu nên cho phép các xác nhận có thể xâu chuỗi giống như giao diện mong đợi, tuy nhiên, nó mở rộng từng đối tượng với thuộc tính nên để bắt đầu chuỗi của bạn. Kiểu này có một số vấn đề khi được sử dụng với Internet Explorer, vì vậy hãy lưu ý về khả năng tương thích của trình duyệ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);

Sự khác biệt giữa mong đợi và nên

Trước hết, lưu ý rằng yêu cầu kỳ vọng chỉ là một tham chiếu đến hàm mong đợi, trong khi với yêu cầu nên, hàm đang được thực thi.

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

Các mong đợi giao diện cung cấp một chức năng như là một điểm khởi đầu cho chaining khẳng định ngôn ngữ của bạn. Nó hoạt động trên node.js và trong tất cả các trình duyệt.

Các nên giao diện mở rộng Object.prototype để cung cấp một getter đơn như là điểm bắt đầu cho khẳng định ngôn ngữ của bạn. Nó hoạt động trên node.js và trong tất cả các trình duyệt hiện đại trừ Internet Explorer.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.