Утилиты плагинов
Утилиты плагинов предназначены для тех, кто хочет расширить Chai собственным набором утверждений. Руководства по Концепции плагина Кода и Создание помощника — отличная справочная информация для начала работы со своими утверждениями.
Справочник API
.addChainableMethod(ctx, name, method, chainingBehavior)
Добавляет метод к объекту, позволяя его цепочную вызов.
utils.addChainableMethod(chai.Assertion.prototype, 'foo', function (str) {
var obj = utils.flag(this, 'object');
new chai.Assertion(obj).to.be.equal(str);
});
Также к нему можно получить доступ напрямую из chai.Assertion.
chai.Assertion.addChainableMethod('foo', fn, chainingBehavior);
Результат может быть использован как утверждение метода, выполняя как method и chainingBehavior, или как цепочный язык, выполняющий только chainingBehavior.
expect(fooStr).to.be.foo('bar');
expect(fooStr).to.be.foo.equal('foo');
.addLengthGuard(fn, assertionName, isChainable)
Определить length как свойство-геттер заданного невызванного утверждения метода. Геттер выступает в качестве защиты от цепочной записи length напрямую после невызванного утверждения метода, что является проблемой, так как он ссылается на встроенное length свойство function, а не на утверждение Chai length.
Существует два способа совершить эту ошибку. Первый способ — это цепочная запись утверждения length напрямую после невызванного цепочного метода. В этом случае Chai предлагает пользователю использовать lengthOf вместо этого. Второй способ — это цепочная запись утверждения length напрямую после невызванного метода без цепочки. Методы без цепочной записи должны быть вызваны до цепочки. В этом случае Chai предлагает пользователю обратиться к документации по данному утверждению.
Если свойство length функций не может быть переконфигурировано, то верните fn без изменений.
Обратите внимание, что в ES6 свойство функции length может быть переконфигурировано, поэтому после того, как поддержка устаревших сред будет прекращена, свойство Chai length сможет заменить встроенное свойство функции length, и этот ограничитель длины больше не понадобится. Тем временем приоритетом является поддержание согласованности во всех средах.
.addMethod(ctx, name, method)
Добавляет метод к прототипу объекта.
utils.addMethod(chai.Assertion.prototype, 'foo', function (str) {
var obj = utils.flag(this, 'object');
new chai.Assertion(obj).to.be.equal(str);
});
Также к нему можно получить доступ напрямую из chai.Assertion.
chai.Assertion.addMethod('foo', fn);
Затем он может быть использован как любое другое утверждение.
expect(fooStr).to.be.foo('bar');
.addProperty(ctx, name, getter)
Добавляет свойство к прототипу объекта.
utils.addProperty(chai.Assertion.prototype, 'foo', function () {
var obj = utils.flag(this, 'object');
new chai.Assertion(obj).to.be.instanceof(Foo);
});
Также к нему можно получить доступ напрямую из chai.Assertion.
chai.Assertion.addProperty('foo', fn);
Затем он может быть использован как любое другое утверждение.
expect(myFoo).to.be.foo;
.compareByInspect(mixed, mixed)
Используется в качестве compareFunction с Array.prototype.sort. Сравнивает элементы с помощью inspect вместо стандартного поведения использования toString, поэтому символы и объекты с нестандартным/отсутствующим toString все еще могут быть отсортированы без ошибки TypeError.
.expectTypes(obj, types)
Обеспечивает, что тестируемый объект имеет допустимый тип.
utils.expectTypes(this, ['array', 'object', 'string']);
.flag(object, key, [value])
Получение или установка значения флага в объекте. Если значение предоставлено, оно будет установлено, в противном случае будет возвращено текущее значение или undefined, если значение не установлено.
utils.flag(this, 'foo', 'bar'); // setter
utils.flag(this, 'foo'); // getter, returns `bar`
.getActual(object, [actual])
Возвращает значение actual для утверждения.
.getEnumerableProperties(object)
Это позволяет получить имена перечисляемых свойств объекта, унаследованных или нет.
.getMessage(object, message, negateMessage)
Строит сообщение об ошибке на основе флагов и шаблонов меток. Метки шаблонов вернут строковое представление объекта, на который ссылаются.
Метки шаблонов сообщений:
-
#{this}текущий объект, утверждаемый -
#{act}фактическое значение -
#{exp}ожидаемое значение
.getOperator(message)
Извлечение оператора из сообщения об ошибке. Определенный оператор основан на ссылке https://nodejs.org/api/assert.html#assert_assert.
Возвращает значение operator или undefined для утверждения.
.getOwnEnumerableProperties(object)
Это позволяет получить имена и символы непосредственно принадлежащих перечисляемых свойств объекта. Эта функция необходима, так как Object.keys возвращает только имена перечисляемых свойств, а не перечисляемые символы свойств.
.getOwnEnumerablePropertySymbols(object)
Это позволяет получить символы перечисляемых свойств, непосредственно принадлежащих объекту. Эта функция необходима, потому что Object.getOwnPropertySymbols возвращает как перечисляемые, так и неперечисляемые символы свойств.
.getProperties(object)
Это позволяет получить имена свойств объекта, перечисляемые или нет, унаследованные или нет.
.inspect(obj, [showHidden], [depth], [colors])
Выводит значение значения. Пытается вывести значение наилучшим образом с учетом различных типов.
.isProxyEnabled()
Вспомогательная функция для проверки, включена ли функция защиты прокси Chai. Если прокси не поддерживаются или отключены в конфигурации Chai пользователя, то возвращает false. В противном случае возвращает true.
.objDisplay(object)
Определяет, соответствует ли объект или массив критериям для проверки в строке сообщений об ошибках или должен быть усечен.
.overwriteChainableMethod(ctx, name, method, chainingBehavior)
Перезаписывает уже существующий цепной метод и предоставляет доступ к предыдущей функции или свойству. Должен возвращать функции, используемые для имени.
utils.overwriteChainableMethod(chai.Assertion.prototype, 'lengthOf',
function (_super) {
}
, function (_super) {
}
);
Также может быть вызван напрямую из chai.Assertion.
chai.Assertion.overwriteChainableMethod('foo', fn, fn);
Затем может быть использован как любое другое утверждение.
expect(myFoo).to.have.lengthOf(3);
expect(myFoo).to.have.lengthOf.above(3);
.overwriteMethod(ctx, name, fn)
Перезаписывает уже существующий метод и предоставляет доступ к предыдущей функции. Должна возвращать функцию, используемую для имени.
utils.overwriteMethod(chai.Assertion.prototype, 'equal', function (_super) {
return function (str) {
var obj = utils.flag(this, 'object');
if (obj instanceof Foo) {
new chai.Assertion(obj.value).to.equal(str);
} else {
_super.apply(this, arguments);
}
}
});
Также может быть вызван напрямую из chai.Assertion.
chai.Assertion.overwriteMethod('foo', fn);
Затем может быть использован как любое другое утверждение.
expect(myFoo).to.equal('bar');
.overwriteProperty(ctx, name, fn)
Перезаписывает уже существующий геттер свойства и предоставляет доступ к предыдущему значению. Должна возвращать функцию для использования в качестве геттера.
utils.overwriteProperty(chai.Assertion.prototype, 'ok', function (_super) {
return function () {
var obj = utils.flag(this, 'object');
if (obj instanceof Foo) {
new chai.Assertion(obj.name).to.equal('bar');
} else {
_super.call(this);
}
}
});
Также может быть вызван напрямую из chai.Assertion.
chai.Assertion.overwriteProperty('foo', fn);
Затем может быть использован как любое другое утверждение.
expect(myFoo).to.be.ok;
.proxify(object)
Возвращает прокси заданного объекта, который генерирует ошибку при чтении несуществующего свойства. По умолчанию предполагается, что причиной является неправильно написанное свойство, и поэтому делается попытка предложить разумное предложение из списка существующих свойств. Однако, если предоставлено nonChainableMethodName, то причиной является неудача в вызове нецепного метода перед чтением несуществующего свойства.
Если прокси не поддерживаются или отключены в конфигурации Chai пользователя, то возвращает объект без изменений.
.test(object, expression)
Тестирует объект на соответствие выражению.
.transferFlags(assertion, object, includeAll = true)
Копирует все флаги из assertion в object . Если includeAll установлено в значение false, то базовые флаги утверждения Chai (а именно object, ssfi, lockSsfi, и message) не будут скопированы.
var newAssertion = new Assertion();
utils.transferFlags(assertion, newAssertion);
var anotherAssertion = new Assertion(myObj);
utils.transferFlags(assertion, anotherAssertion, false);
.compatibleInstance(thrown, errorLike)
Проверяет, совместимы ли два экземпляра (строго равны). Возвращает false, если errorLike не является экземпляром Error, потому что экземпляры совместимы только если оба являются экземплярами ошибок.
.compatibleConstructor(thrown, errorLike)
Проверяет, совместимы ли два конструктора. Эта функция может принимать как конструктор ошибки, так и экземпляр ошибки в качестве аргумента errorLike. Конструкторы совместимы, если они одинаковы или если один является экземпляром другого.
.compatibleMessage(thrown, errMatcher)
Проверяет, совместимо ли сообщение об ошибке с соответствием (строка или регулярное выражение). Если сообщение содержит строку или проходит проверку регулярного выражения, оно считается совместимым.
.getFunctionName(constructorFn)
Возвращает имя функции. Также включает функцию полифила, если constructorFn.name не определена.
.getConstructorName(errorLike)
Получает имя конструктора для экземпляра Error или самого конструктора.
.getMessage(errorLike)
Получает сообщение об ошибке из объекта ошибки. Если err является строкой, возвращает её. Если у ошибки нет сообщения, возвращает пустую строку.
.getFuncName(constructorFn)
Возвращает имя функции. Если передан не экземпляр функции, возвращает null. Также включает функцию полифила, если aFunc.name не определена.
.hasProperty(object, name)
Позволяет проверить, имеет ли объект собственное или унаследованное свойство с заданным именем.
В основном делает то же, что и оператор in, но корректно работает с значениями null/undefined и другими примитивами.
var obj = {
arr: ['a', 'b', 'c']
, str: 'Hello'
}
Результаты будут следующими.
hasProperty(obj, 'str'); // true
hasProperty(obj, 'constructor'); // true
hasProperty(obj, 'bar'); // false
hasProperty(obj.str, 'length'); // true
hasProperty(obj.str, 1); // true
hasProperty(obj.str, 5); // false
hasProperty(obj.arr, 'length'); // true
hasProperty(obj.arr, 2); // true
hasProperty(obj.arr, 3); // false
.getPathInfo(object, path)
Позволяет получить информацию о свойстве в объекте по строковому пути.
Информация о пути состоит из объекта со следующими свойствами:
- parent - Родительский объект свойства, на которое ссылается
path - name - Имя конечного свойства, число, если это индексатор массива
- value - Значение свойства, если оно существует, иначе
undefined - exists - Существует ли свойство или нет
.getPathValue(object, path)
Позволяет получить значения в объекте по строковому пути.
var obj = {
prop1: {
arr: ['a', 'b', 'c']
, str: 'Hello'
}
, prop2: {
arr: [ { nested: 'Universe' } ]
, str: 'Hello again!'
}
}
Результаты будут следующими.
getPathValue(obj, 'prop1.str'); // Hello
getPathValue(obj, 'prop1.att[2]'); // b
getPathValue(obj, 'prop2.arr[0].nested'); // Universe
© 2017 Chai.js Assertion Library
Licensed under the MIT License.
https://www.chaijs.com/api/plugins/