В чем разница между утверждать, ожидать и следует в чай?

161

В чем разница между assert, expectи should, и когда использовать то , что?

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

var foo = 'bar';

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

foo.should.equal('bar');
Manu
источник

Ответы:

289

Различия документированы там .

Три интерфейса представляют разные стили выполнения утверждений. В конечном итоге они выполняют одну и ту же задачу. Некоторые пользователи предпочитают один стиль другому. При этом следует также отметить пару технических соображений:

  1. Интерфейсы Assert и Expect не меняются Object.prototype, тогда как должны. Таким образом, они являются лучшим выбором в среде, где вы не можете или не хотите меняться Object.prototype.

  2. Интерфейсы assert и Ожидают поддерживают пользовательские сообщения почти везде. Например:

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

    Сообщение "foo должно быть истиной" будет выведено вместе с ошибочным утверждением, если утверждение не выполнено. У вас нет возможности установить пользовательское сообщение с интерфейсом must.

(Историческая справка: долгое время в этом ответе говорилось, что для получения настраиваемого сообщения 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 не является критической. Вы используете последний чай?
Луи
То же самое для меня, в проектах vanilla express (4.16.3), mocha (5.1.1), chai (4.1.2), chai-http (4.0.0). Настраиваемое сообщение нигде не появляется при запуске с командой mochaи получении тестового сбоя.
Юха Унтинен,
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');

Во всех случаях стиль assert позволяет вам включить необязательное сообщение в качестве последнего параметра в операторе assert. Они будут включены в сообщения об ошибках, если ваше утверждение не пройдет.

Заметьте, что ожидайте и должны использовать цепочечный язык для построения утверждений, но они отличаются в том, как изначально создается утверждение. В случае необходимости, есть также некоторые предостережения и дополнительные инструменты для преодоления предостережений.

ожидать

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

Это удобно, когда используется с неописанными темами, такими как логические значения или числа.

Должен

Стиль should допускает те же цепочки утверждений, что и ожидаемый интерфейс, однако он расширяет каждый объект свойством 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.

Adépòjù Olúwáségun
источник