Тестирование¶
Стабильность: 2 – Стабильная
АПИ является удовлетворительным. Совместимость с NPM имеет высший приоритет и не будет нарушена кроме случаев явной необходимости.
Модуль node:assert предоставляет набор функций утверждения для проверки инвариантов.
Режим строгого утверждения¶
В режиме строгого утверждения нестрогие методы ведут себя как соответствующие им строгие методы. Например, assert.deepEqual() будет вести себя как assert.deepStrictEqual().
В режиме строгого утверждения сообщения об ошибках для объектов показывают diff. В устаревшем режиме утверждения сообщения об ошибках для объектов показывают сами объекты, часто в усечённом виде.
Семантика параметра message¶
Для методов утверждения, принимающих необязательный параметр message, сообщение можно передать в одной из следующих форм:
- string: Используется как есть. Если после строки
messageуказаны дополнительные аргументы, они обрабатываются как подстановки в стиле printf (см.util.format()). - Error: Если в качестве
messageпередан экземплярError, выбрасывается именно эта ошибка, а неAssertionError. - function: Функция вида
(actual, expected) => string. Вызывается только при провале утверждения и должна вернуть строку, которая будет использована как сообщение об ошибке. Нестроковые возвращаемые значения игнорируются, вместо них используется сообщение по умолчанию.
Если вместе с message в виде Error или функции переданы дополнительные аргументы, вызов отклоняется с ERR_AMBIGUOUS_ARGUMENT.
Если первый аргумент не является строкой, Error или функцией, выбрасывается ERR_INVALID_ARG_TYPE.
Чтобы использовать режим строгого утверждения:
1 | |
1 | |
1 | |
1 | |
Пример diff в сообщении об ошибке:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Чтобы отключить цвета, используйте переменные окружения NO_COLOR или NODE_DISABLE_COLORS. Это также отключит цвета в REPL. Подробнее о поддержке цветов в терминальных средах см. документацию по tty getColorDepth().
Устаревший режим утверждения¶
Устаревший режим утверждения использует оператор == в:
Чтобы использовать устаревший режим утверждения:
1 | |
1 | |
Устаревший режим утверждения может давать неожиданные результаты, особенно при использовании assert.deepEqual():
1 2 3 | |
Класс: assert.AssertionError¶
- Наследует:
<errors.Error>
Указывает на неудачу утверждения. Все ошибки, выбрасываемые модулем node:assert, являются экземплярами класса AssertionError.
new assert.AssertionError(options)¶
options<Object>message<string>Если указано, сообщение об ошибке устанавливается в это значение.actual<any>Свойствоactualу экземпляра ошибки.expected<any>Свойствоexpectedу экземпляра ошибки.operator<string>Свойствоoperatorу экземпляра ошибки.stackStartFn<Function>Если задано, сгенерированная трассировка стека не включает кадры выше этой функции.diff<string>При значении'full'в ошибках утверждения показывается полный diff. По умолчанию'simple'. Допустимые значения:'simple','full'.
Подкласс Error, указывающий на неудачу утверждения.
Все экземпляры содержат встроенные свойства Error (message и name) и:
actual<any>Устанавливается в аргументactualдля таких методов, какassert.strictEqual().expected<any>Устанавливается в ожидаемое значение для таких методов, какassert.strictEqual().generatedMessage<boolean>Показывает, было ли сообщение сгенерировано автоматически (true) или нет.code<string>Значение всегдаERR_ASSERTION, чтобы указать, что это ошибка утверждения.operator<string>Устанавливается в переданное значение оператора.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
Класс: assert.Assert¶
Класс Assert позволяет создавать независимые экземпляры утверждений с пользовательскими параметрами.
new assert.Assert([options])¶
options<Object>diff<string>При значении'full'в ошибках утверждения показывается полный diff. По умолчанию'simple'. Допустимые значения:'simple','full'.strict<boolean>Приtrueнестрогие методы ведут себя как соответствующие строгие. По умолчаниюtrue.skipPrototype<boolean>Приtrueпри глубоком сравнении на равенство не сравниваются прототип и конструктор. По умолчаниюfalse.
Создаёт новый экземпляр утверждений. Параметр diff задаёт подробность diff в сообщениях об ошибках утверждения.
1 2 3 4 | |
Важно: при деструктуризации методов утверждений из экземпляра Assert они теряют связь с параметрами конфигурации экземпляра (такими как diff, strict и skipPrototype). У деструктурированных методов используется поведение по умолчанию.
1 2 3 4 5 6 7 8 | |
Параметр skipPrototype влияет на все методы глубокого сравнения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
При деструктуризации методы теряют доступ к контексту this экземпляра и возвращаются к поведению утверждений по умолчанию (diff: 'simple', нестрогий режим). Чтобы сохранить пользовательские параметры при использовании деструктурированных методов, не применяйте деструктуризацию и вызывайте методы напрямую у экземпляра.
assert(value[, message])¶
value<any>Входное значение, проверяемое на истинность.message<string>|<Error>|<Function>
Псевдоним assert.ok().
assert.deepEqual(actual, expected[, message])¶
actual<any>expected<any>message<string>|<Error>|<Function>
Режим строгих утверждений (strict assertion mode)
Псевдоним assert.deepStrictEqual().
Режим унаследованных утверждений (legacy assertion mode)
Стабильность: 3 - Legacy: вместо этого используйте
assert.deepStrictEqual().
Проверяет глубокое равенство между параметрами actual и expected. Предпочтительно использовать assert.deepStrictEqual() - у assert.deepEqual() результат может быть неожиданным.
Глубокое равенство означает, что перечислимые собственные свойства вложенных объектов также рекурсивно оцениваются по следующим правилам.
Детали сравнения¶
- Примитивы сравниваются оператором
==, за исключением {NaN}: если с обеих сторон {NaN}, они считаются совпадающими. - Теги типов объектов должны совпадать.
- Учитываются только перечислимые собственные свойства.
- Обёртки над примитивами сравниваются и как объекты, и как развёрнутые значения.
- Реализация не проверяет
[[Prototype]]объектов. - Свойства Symbol не сравниваются.
- Экземпляры WeakMap, WeakSet и Promise не сравниваются структурно: они равны только если ссылаются на один и тот же объект. Любое сравнение разных экземпляров
WeakMap,WeakSetилиPromiseдаёт неравенство, даже при одинаковом содержимом. - У RegExp всегда сравниваются
lastIndex, флаги иsource, даже если это не перечислимые свойства.
Следующий пример не выбрасывает AssertionError, потому что примитивы сравниваются оператором ==.
1 2 3 4 | |
1 2 3 4 | |
«Глубокое» равенство означает, что перечислимые собственные свойства вложенных объектов также учитываются:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | |
Если значения не равны, выбрасывается AssertionError: свойство message равно значению параметра message. Если message не передан, подставляется сообщение по умолчанию. Если message является экземпляром Error, выбрасывается он, а не AssertionError.
assert.deepStrictEqual(actual, expected[, message])¶
actual<any>expected<any>message<string>|<Error>|<Function>
Проверяет глубокое равенство между параметрами actual и expected. «Глубокое» равенство означает, что перечислимые собственные свойства вложенных объектов также рекурсивно оцениваются по следующим правилам.
Детали сравнения¶
- Примитивы сравниваются через
Object.is(). - Теги типов объектов должны совпадать.
[[Prototype]]объектов сравнивается оператором===.- Учитываются только перечислимые собственные свойства.
- Обёртки над примитивами сравниваются и как объекты, и как развёрнутые значения.
- Свойства объектов
Objectсравниваются без учёта порядка. - Ключи Map и элементы Set сравниваются без учёта порядка.
- Рекурсия останавливается, когда значения различаются или когда одна из сторон натыкается на циклическую ссылку.
- Экземпляры WeakMap, WeakSet и Promise не сравниваются структурно: они равны только если ссылаются на один и тот же объект. Любое сравнение разных экземпляров
WeakMap,WeakSetилиPromiseдаёт неравенство, даже при одинаковом содержимом. - У RegExp всегда сравниваются
lastIndex, флаги иsource, даже если это не перечислимые свойства.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | |
Если значения не равны, выбрасывается AssertionError: свойство message равно значению параметра message. Если message не передан, подставляется сообщение по умолчанию. Если message является экземпляром Error, выбрасывается он, а не AssertionError.
assert.doesNotMatch(string, regexp[, message])¶
string<string>regexp<RegExp>message<string>|<Error>|<Function>
Ожидается, что строка string не будет соответствовать регулярному выражению.
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 | |
Если строка совпадает с шаблоном или аргумент string имеет тип, отличный от string, выбрасывается AssertionError: свойство message равно значению параметра message. Если message не передан, подставляется сообщение по умолчанию. Если message является экземпляром Error, выбрасывается он, а не AssertionError.
assert.doesNotReject(asyncFn[, error][, message])¶
asyncFn<Function>|<Promise>error<RegExp>|<Function>message<string>- Возвращает:
<Promise>
Ожидает завершения промиса asyncFn или, если asyncFn - функция, сразу вызывает её и ожидает промис из возвращаемого значения. Затем проверяется, что промис не был отклонён.
Если asyncFn - функция и она синхронно выбрасывает ошибку, assert.doesNotReject() вернёт отклонённый Promise с этой ошибкой. Если функция не возвращает промис, assert.doesNotReject() вернёт отклонённый Promise с ошибкой ERR_INVALID_RETURN_VALUE. В обоих случаях обработчик ошибки из проверки типа не используется.
На практике assert.doesNotReject() почти не полезен: мало смысла перехватывать отклонение и снова отклонять промис. Лучше оставить комментарий у участка кода, который не должен завершаться отклонением, и формулировать сообщения об ошибках максимально ясно.
При необходимости параметр error может быть Class, RegExp или функцией проверки. Подробнее - в assert.throws().
Поведение после ожидания завершения совпадает с assert.doesNotThrow(), кроме асинхронности.
1 2 3 4 5 | |
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 | |
assert.doesNotThrow(fn[, error][, message])¶
fn<Function>error<RegExp>|<Function>message<string>
Утверждает, что функция fn не выбрасывает ошибку.
На практике assert.doesNotThrow() почти не полезен: мало смысла перехватывать ошибку и тут же пробрасывать её снова. Лучше оставить комментарий у участка кода, который не должен выбрасывать ошибку, и формулировать сообщения максимально ясно.
При вызове assert.doesNotThrow() функция fn выполняется сразу.
Если ошибка выброшена и её тип совпадает с типом, заданным параметром error, выбрасывается AssertionError. Если тип другой или параметр error не задан, ошибка пробрасывается вызывающему коду.
При необходимости error может быть Class, RegExp или функцией проверки. Подробнее - в assert.throws().
В следующем примере будет выброшен TypeError, потому что в утверждении нет подходящего типа ошибки:
1 2 3 4 5 | |
1 2 3 4 5 | |
Следующий пример приводит к AssertionError с сообщением «Got unwanted exception...»:
1 2 3 4 5 | |
1 2 3 4 5 | |
Если выброшена AssertionError и для параметра message задано значение, оно дописывается к сообщению AssertionError:
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 | |
assert.equal(actual, expected[, message])¶
actual<any>expected<any>message<string>|<Error>|<Function>
Режим строгих утверждений (strict assertion mode)
Псевдоним assert.strictEqual().
Режим унаследованных утверждений (legacy assertion mode)
Стабильность: 3 - Legacy: вместо этого используйте
assert.strictEqual().
Проверяет неглубокое равенство с приведением типов между actual и expected с помощью оператора ==. NaN обрабатывается особым образом: считается совпадающим, если NaN с обеих сторон.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Если значения не равны, выбрасывается AssertionError: свойство message равно значению параметра message. Если message не передан, подставляется сообщение по умолчанию. Если message является экземпляром Error, выбрасывается он, а не AssertionError.
assert.fail([message])¶
Выбрасывает AssertionError с указанным сообщением или сообщением по умолчанию. Если message является экземпляром Error, выбрасывается он, а не AssertionError.
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 | |
assert.ifError(value)¶
value<any>
Выбрасывает value, если оно не undefined и не null. Удобно при проверке аргумента error в колбэках. В трассировку стека входят все кадры из переданной в ifError() ошибки, включая возможные новые кадры для самой ifError().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
assert.match(string, regexp[, message])¶
string<string>regexp<RegExp>message<string>|<Error>|<Function>
Ожидается, что строка string соответствует регулярному выражению.
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 | |
Если строка не совпадает с шаблоном или аргумент string имеет тип, отличный от string, выбрасывается AssertionError: свойство message равно значению параметра message. Если message не передан, подставляется сообщение по умолчанию. Если message является экземпляром Error, выбрасывается он, а не AssertionError.
assert.notDeepEqual(actual, expected[, message])¶
actual<any>expected<any>message<string>|<Error>|<Function>
Строгий режим утверждения
Псевдоним assert.notDeepStrictEqual().
Режим утверждения Legacy
Стабильность: 3 - Legacy: вместо этого используйте
assert.notDeepStrictEqual().
Проверяет произвольное глубокое неравенство. Противоположность assert.deepEqual().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | |
Если значения глубоко равны, выбрасывается AssertionError со свойством message, равным значению параметра message. Если параметр message имеет значение undefined, подставляется сообщение об ошибке по умолчанию. Если параметр message является экземпляром Error, он будет выброшен вместо AssertionError.
assert.notDeepStrictEqual(actual, expected[, message])¶
actual<any>expected<any>message<string>|<Error>|<Function>
Проверяет глубокое строгое неравенство. Противоположность assert.deepStrictEqual().
1 2 3 4 | |
1 2 3 4 | |
Если значения глубоко и строго равны, выбрасывается AssertionError со свойством message, равным значению параметра message. Если параметр message имеет значение undefined, подставляется сообщение об ошибке по умолчанию. Если параметр message является экземпляром Error, он будет выброшен вместо AssertionError.
assert.notEqual(actual, expected[, message])¶
actual<any>expected<any>message<string>|<Error>|<Function>
Строгий режим утверждения
Псевдоним assert.notStrictEqual().
Режим утверждения Legacy
Стабильность: 3 - Legacy: вместо этого используйте
assert.notStrictEqual().
Проверяет неглубокое принудительное неравенство с помощью !=. NaN обрабатывается особым образом и считается совпадающим, если обе стороны - NaN.
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 | |
Если значения равны, выбрасывается AssertionError со свойством message, равным значению параметра message. Если параметр message имеет значение undefined, подставляется сообщение об ошибке по умолчанию. Если параметр message является экземпляром Error, он будет выброшен вместо AssertionError.
assert.notStrictEqual(actual, expected[, message])¶
actual<any>expected<any>message<string>|<Error>|<Function>
Проверяет строгое неравенство между параметрами actual и expected, определяемое Object.is().
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
Если значения строго равны, выбрасывается AssertionError со свойством message, равным значению параметра message. Если параметр message имеет значение undefined, подставляется сообщение об ошибке по умолчанию. Если параметр message является экземпляром Error, он будет выброшен вместо AssertionError.
assert.ok(value[, message])¶
value<any>message<string>|<Error>|<Function>
Проверяет, является ли value истинным (truthy). Эквивалентно assert.equal(!!value, true, message).
Если value ложно (falsy), выбрасывается AssertionError со свойством message, равным значению параметра message. Если параметр message имеет значение undefined, подставляется сообщение об ошибке по умолчанию. Если параметр message является экземпляром Error, он будет выброшен вместо AssertionError. Если аргументы не переданы вообще, message будет установлена в строку 'No value argument passed to `assert.ok()`'.
Имейте в виду: в REPL текст ошибки отличается от того, что выводится при выполнении файла. Подробности ниже.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | |
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 | |
assert.rejects(asyncFn[, error][, message])¶
asyncFn<Function>|<Promise>error<RegExp>|<Function>|<Object>|<Error>message<string>- Возвращает:
<Promise>
Ожидает промис asyncFn или, если asyncFn - функция, сразу вызывает её и ожидает завершения возвращённого промиса. Затем проверяется, что промис отклонён.
Если asyncFn - функция и она синхронно выбрасывает ошибку, assert.rejects() вернёт отклонённый Promise с этой ошибкой. Если функция не возвращает промис, assert.rejects() вернёт отклонённый Promise с ошибкой ERR_INVALID_RETURN_VALUE. В обоих случаях обработчик ошибки пропускается.
Помимо асинхронного ожидания завершения поведение совпадает с assert.throws().
Если указано, error может быть Class, RegExp, функцией проверки, объектом, для которого проверяется каждое свойство, или экземпляром ошибки, для которого проверяется каждое свойство, включая неперечислимые свойства message и name.
Если указано, message будет сообщением, которое передаёт AssertionError, если asyncFn не отклонится.
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 | |
error не может быть строкой. Если вторым аргументом передана строка, считается, что error опущен, и строка используется как message. Это легко даёт незаметные ошибки. Внимательно прочитайте пример в assert.throws(), если рассматриваете передачу строки вторым аргументом.
assert.strictEqual(actual, expected[, message])¶
actual<any>expected<any>message<string>|<Error>|<Function>Постфиксные аргументы в стилеprintf, еслиmessageиспользуется как строка формата. Еслиmessage- функция, она вызывается при несовпадении сравнения. Функция получает аргументыactualиexpectedи должна вернуть строку, которая будет использована как сообщение об ошибке. Строки формата в стилеprintfи функции удобны для производительности, когда аргументы пробрасываются дальше. Кроме того, так проще получить аккуратное форматирование.
Проверяет строгое равенство между параметрами actual и expected так, как определяет Object.is().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | |
Если значения не строго равны, выбрасывается AssertionError со свойством message, равным значению параметра message. Если параметр message равен undefined, подставляется сообщение об ошибке по умолчанию. Если параметр message является экземпляром Error, выбрасывается он, а не AssertionError.
assert.throws(fn[, error][, message])¶
fn<Function>error<RegExp>|<Function>|<Object>|<Error>message<string>
Ожидает, что функция fn выбросит ошибку.
Если указано, error может быть Class, RegExp, функцией проверки, объектом проверки, для каждого свойства которого проверяется строгое глубокое равенство, или экземпляром ошибки, для каждого свойства которого проверяется строгое глубокое равенство, включая неперечислимые свойства message и name. При использовании объекта для проверки строкового свойства можно использовать регулярное выражение. Примеры см. ниже.
Если указано, message дополняет сообщение, которое даёт AssertionError, если вызов fn не привёл к выбросу или если проверка ошибки не прошла.
Пользовательский объект проверки / экземпляр ошибки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | |
Проверка instanceof через конструктор:
1 2 3 4 5 | |
1 2 3 4 5 | |
Проверка сообщения об ошибке с помощью RegExp:
При использовании регулярного выражения для объекта ошибки вызывается .toString, поэтому в сопоставление попадает и имя ошибки.
1 2 3 4 5 | |
1 2 3 4 5 | |
Пользовательская проверка ошибки:
Функция должна вернуть true, чтобы показать, что все внутренние проверки прошли. Иначе проверка завершится с AssertionError.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
error не может быть строкой. Если вторым аргументом передана строка, считается, что error опущен, и строка используется как message. Это легко даёт незаметные ошибки. Если сообщение совпадает с текстом выброшенной ошибки, возникнет ошибка ERR_AMBIGUOUS_ARGUMENT. Внимательно прочитайте пример ниже, если рассматриваете передачу строки вторым аргументом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | |
Из-за запутанной и подверженной ошибкам записи не используйте строку вторым аргументом.
assert.partialDeepStrictEqual(actual, expected[, message])¶
actual<any>expected<any>message<string>|<Error>|<Function>
Проверяет частичное глубокое равенство между параметрами actual и expected. «Глубокое» равенство означает, что перечислимые собственные свойства дочерних объектов рекурсивно оцениваются по правилам ниже. «Частичное» равенство означает, что сравниваются только свойства, присутствующие в параметре expected.
Этот метод всегда проходит те же проверки, что и assert.deepStrictEqual(), и ведёт себя как надмножество этой функции.
Детали сравнения¶
- Примитивы сравниваются через
Object.is(). - Теги типов объектов должны совпадать.
[[Prototype]]объектов не сравниваются.- Учитываются только перечислимые собственные свойства.
- Обёртки объектов сравниваются и как объекты, и как развёрнутые значения.
- Свойства
Objectсравниваются без учёта порядка. - Ключи Map и элементы Set сравниваются без учёта порядка.
- Рекурсия останавливается, когда обе стороны различаются или обе доходят до циклической ссылки.
- Экземпляры WeakMap, WeakSet и Promise не сравниваются структурно. Они равны только если ссылаются на один и тот же объект. Любое сравнение разных экземпляров
WeakMap,WeakSetилиPromiseдаст неравенство, даже при одинаковом содержимом. - У RegExp всегда сравниваются
lastIndex, флаги иsource, даже если это неперечислимые свойства. - Дыры в разреженных массивах игнорируются.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | |