Відповіді:
Відмінності описуватися .
Три інтерфейси представляють різні стилі виконання тверджень. Зрештою, вони виконують те саме завдання. Деякі користувачі віддають перевагу одному стилю над іншим. Це, як сказано, також має кілька технічних міркувань, які варто підкреслити:
Інтерфейси затвердження та очікування не змінюються Object.prototype
, тоді як повинні. Таким чином, вони є кращим вибором в умовах, коли ви не можете чи не хочете змінюватися Object.prototype
.
Інтерфейси утвердження та очікування підтримують власні повідомлення майже скрізь. Наприклад:
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
. Якщо ви хочете знати, що ви тестували, вам потрібно додати повідомлення.
expect
, використовуючи останню версію мокко
mocha
і отримується тест-помилка.
Я сподіваюся, що ці прості приклади чітко пояснюють їх відмінності
Затвердити
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.
expect(foo).to.equal(true, "foo should be true");