Стили утверждений
В этом разделе руководства вы познакомитесь с тремя различными стилями утверждений, которые можно использовать в вашей тестовой среде. После выбора стиля рекомендуется ознакомиться с документацией API выбранного стиля.
Assert
Стиль assert доступен через интерфейс assert. Он предоставляет классическую нотацию утверждений с точкой, аналогичную той, что поставляется с node.js. Однако этот модуль assert предоставляет несколько дополнительных тестов и совместим с браузерами.
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. Эти сообщения будут включены в сообщения об ошибках, если ваше утверждение не пройдёт.
BDD
Стиль BDD представлен в двух вариантах: expect и should. Оба используют одинаковый цепной язык для построения утверждений, но различаются по способу первоначального построения утверждения. В случае should, также есть некоторые замечания и дополнительные инструменты для преодоления этих замечаний.
Expect
Стиль BDD доступен через интерфейсы expect или should. В обоих случаях вы цепляете вместе утверждения естественного языка.
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
Стиль should позволяет использовать те же цепные утверждения, что и интерфейс expect, но расширяет каждый объект свойством should, чтобы начать цепочку. Этот стиль имеет некоторые проблемы при использовании с 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);
Отличия
Прежде всего, обратите внимание, что expect требует только ссылку на функцию expect, тогда как should требует выполнения функции.
var chai = require('chai')
, expect = chai.expect
, should = chai.should();
Интерфейс expect предоставляет функцию в качестве отправной точки для цепочки утверждений языка. Он работает в node.js и во всех браузерах.
Интерфейс should расширяет Object.prototype, чтобы предоставить единственный getter в качестве отправной точки для цепочки утверждений языка. Он работает в node.js и во всех современных браузерах, кроме Internet Explorer.
Дополнительные возможности Should
Поскольку should работает путём расширения Object.prototype, есть некоторые ситуации, когда should не сработает. В основном, если вы пытаетесь проверить существование объекта. Рассмотрим следующий псевдокод:
db.get(1234, function (err, doc) {
// we expect error to not exist
// we expect doc to exist and be an object
});
Поскольку err должно быть null или undefined, err.should.not.exist не является корректным утверждением, так как undefined и null не были расширены началом цепочки should. Поэтому подходящие утверждения для этой ситуации таковы:
var should = require('chai').should();
db.get(1234, function (err, doc) {
should.not.exist(err);
should.exist(doc);
doc.should.be.an('object');
});
При условии, что вы присвоили should переменной, у вас есть доступ к нескольким быстрым помощникам, чтобы избежать проблем при использовании should.
should.existshould.not.existshould.equalshould.not.equalshould.Throwshould.not.Throw
Использование Should в ES2015
Невозможно зацепить вызов функции из инструкции ES2015 import – он должен выполняться на отдельной строке, что выглядит немного громоздко:
import chai from 'chai';
chai.should();
Для более чистого вида можно сделать так:
import 'chai/register-should';
Настройка
config.includeStack
- @param {Boolean}
-
@default
false
Настраиваемое свойство, влияющее на включение трассировки стека в сообщение об ошибке утверждения. Значение по умолчанию false подавляет трассировку стека в сообщении об ошибке.
chai.config.includeStack = true; // turn on stack trace
config.showDiff
- @param {Boolean}
-
@default
true
Настраиваемое свойство, влияющее на включение флага showDiff в исключения AssertionErrors. false всегда false; true будет true, когда утверждение запросило отображение различий.
chai.config.showDiff = false; // turn off reporter diff display
config.truncateThreshold
- @param {Number}
-
@default
40
Настраиваемое свойство, устанавливающее пороговое значение длины для фактических и ожидаемых значений в сообщениях об ошибках утверждений. Если этот порог превышен, значение усекается.
Установите его в ноль, если хотите полностью отключить усечение.
chai.config.truncateThreshold = 0; // disable truncating
© 2017 Chai.js Assertion Library
Licensed under the MIT License.
https://www.chaijs.com/guide/styles/