Яка різниця між ствердженням, очікуванням і слід в Чаї?


160

У чому різниця між assert, expectі should, і коли використовувати?

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

var foo = 'bar';

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

foo.should.equal('bar');

Відповіді:


289

Відмінності описуватися .

Три інтерфейси представляють різні стилі виконання тверджень. Зрештою, вони виконують те саме завдання. Деякі користувачі віддають перевагу одному стилю над іншим. Це, як сказано, також має кілька технічних міркувань, які варто підкреслити:

  1. Інтерфейси затвердження та очікування не змінюються Object.prototype, тоді як повинні. Таким чином, вони є кращим вибором в умовах, коли ви не можете чи не хочете змінюватися Object.prototype.

  2. Інтерфейси утвердження та очікування підтримують власні повідомлення майже скрізь. Наприклад:

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

    Повідомлення "foo має бути правдивим" виводиться разом із невдалим твердженням, якщо твердження не вдасться. Ви не отримуєте можливості встановити користувальницьке повідомлення з інтерфейсом повинен.

(Історична примітка: тривалий час у цій відповіді говорилося, що для отримання спеціального повідомлення expectвам доведеться скористатися методом вирішення. Аурельен Рібон повідомив мені, що передача повідомлення expectяк другий параметр працює. Отже, немає потреби в Я не зміг знайти, яка версія Mocha почала надавати підтримку цього повідомлення, і я не змогла знайти, яка версія документації її вперше задокументувала.)

Зверніть увагу , що assert.isTrue(foo), expect(foo).to.be.trueі foo.should.be.trueвсі вихідні наступне , якщо ви не використовуєте для користувача повідомлення, і foo === 1:

    AssertionError: expected 1 to be true

Тож хоча інтерфейс очікування і повинен приємніше читати , він не схожий на те, що один інтерфейс є більш природно інформативним, ніж інший, коли твердження не вдається. Це повідомлення, ідентичне для всіх трьох інтерфейсів, не говорить вам, що саме ви тестували, лише те, що отримане вами значення було, 1але ви хотіли true. Якщо ви хочете знати, що ви тестували, вам потрібно додати повідомлення.


8
Зауважте, що ви також можете це зробитиexpect(foo).to.equal(true, "foo should be true");
user5325596

Я не можу отримати жодне користувацьке повідомлення, з яким з’являться expect, використовуючи останню версію мокко
Мирко

@Mirko Версія Mocha тут не є критичною. Чи використовуєте ви останній Chai?
Луї

Те саме для мене у ванільному експресі (4.16.3), мока (5.1.1), чаї (4.1.2), chai-http (4.0.0). Власне повідомлення ніде не з’являється, коли запускається з командою mochaі отримується тест-помилка.
Juha Untinen

15

Я сподіваюся, що ці прості приклади чітко пояснюють їх відмінності

Затвердити

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

У всіх випадках стиль затвердження дозволяє включати необов'язкове повідомлення як останній параметр у операторі затвердження. Вони будуть включені до повідомлень про помилки, якщо ваше твердження не пройде.

Зауважте, очікуйте, що для побудови тверджень слід використовувати доступну мову, але вони відрізняються тим, як спочатку будується твердження. У разі потреби, є також деякі застереження та додаткові інструменти для подолання застережень.

Очікуйте

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

Expect дозволяє включити довільні повідомлення, щоб додати будь-які невдалі твердження, які можуть виникнути.

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

Це стане в нагоді при використанні з нерозкритими темами, такими як булеві чи номери.

Повинен

Стиль must дозволяє такі ж можливі твердження, що й інтерфейс очікування, проте він розширює кожен об'єкт із властивістю must для запуску ланцюга. Цей стиль має деякі проблеми при використанні Internet Explorer, тож пам’ятайте про сумісність браузера.

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

Відмінності між очікуванням і слід

Перш за все, зауважте, що потреба очікувати - це лише посилання на функцію очікування, тоді як, якщо вона потребує, функція виконується.

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

Інтерфейс очікування забезпечує функцію відправного пункту для зв’язування ваших мовних тверджень. Він працює на node.js та у всіх браузерах.

Інтерфейс повинен розширювати Object.prototype, щоб надати єдиний геть як вихідну точку для ваших мовних тверджень. Він працює на node.js та у всіх сучасних браузерах, крім Internet Explorer.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.