Ответы:
Различия документированы там .
Три интерфейса представляют разные стили выполнения утверждений. В конечном итоге они выполняют одну и ту же задачу. Некоторые пользователи предпочитают один стиль другому. При этом следует также отметить пару технических соображений:
Интерфейсы Assert и Expect не меняются Object.prototype
, тогда как должны. Таким образом, они являются лучшим выбором в среде, где вы не можете или не хотите меняться Object.prototype
.
Интерфейсы 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
. Если вы хотите узнать, что вы тестировали, вам нужно добавить сообщение.
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');
Во всех случаях стиль 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.
expect(foo).to.equal(true, "foo should be true");