В режиме строгого утверждения нестрогие методы ведут себя как соответствующие им строгие методы. Например, assert.deepEqual() будет вести себя как assert.deepStrictEqual().
В режиме strict assertion сообщения об ошибках для объектов отображают diff. В режиме legacy assertion сообщения об ошибках для объектов отображают сами объекты, часто в усеченном виде.
Чтобы использовать режим строгого утверждения:
1
import { strict as assert } from 'node:assert';
1
const assert = require('node:assert').strict;
1
import assert from 'node:assert/strict';
1
const assert = require('node:assert/strict');
Пример разницы ошибок:
1 2 3 4 5 6 7 8 91011121314151617
import { strict as assert } from 'node:assert';
assert.deepEqual([[[1, 2, 3]], 4, 5], [[[1, 2, '3']], 4, 5]]);
// AssertionError: Ожидается, что входные данные будут строго равны по глубине:
// + фактические - ожидаемые ... Строки пропущены
//
// [
// [
// ...
// 2,
// + 3
// - '3'
// ],
// ...
// 5
// ]
Чтобы отключить цвета, используйте переменные окружения NO_COLOR или NODE_DISABLE_COLORS. Это также отключит цвета в REPL. Подробнее о поддержке цветов в терминальных средах читайте в документации по tty getColorDepth().
Создает новый объект CallTracker, который можно использовать для отслеживания того, вызывались ли функции определенное количество раз. Для проверки необходимо вызвать tracker.verify(). Обычная схема - вызвать его в обработчике process.on('exit').
1 2 3 4 5 6 7 8 91011121314151617
import assert from 'node:assert';
import process from 'node:process';
const tracker = new assert.CallTracker();
function func() {}
// callsfunc() должна быть вызвана ровно 1 раз перед tracker.verify().
const callsfunc = tracker.calls(func, 1);
callsfunc();
// Вызывает tracker.verify() и проверяет, все ли функции tracker.calls()
// были вызваны точное количество раз.
process.on('exit', () => {
tracker.verify();
});
1 2 3 4 5 6 7 8 910111213141516
const assert = require('node:assert');
const tracker = new assert.CallTracker();
function func() {}
// callsfunc() должен быть вызван ровно 1 раз перед tracker.verify().
const callsfunc = tracker.calls(func, 1);
callsfunc();
// Вызывает tracker.verify() и проверяет, все ли функции tracker.calls()
// были вызваны точное количество раз.
process.on('exit', () => {
tracker.verify();
});
Ожидается, что функция-обертка будет вызвана ровно exact раз. Если на момент вызова tracker.verify() функция не была вызвана ровно точное количество раз, то tracker.verify() выдаст ошибку.
1 2 3 4 5 6 7 8 910
import assert from 'node:assert';
// Создает трекер вызовов.
const tracker = new assert.CallTracker();
function func() {}
// Возвращает функцию, обертывающую func(), которая должна быть вызвана точное время
// перед tracker.verify().
const callsfunc = tracker.calls(func);
1 2 3 4 5 6 7 8 910
const assert = require('node:assert');
// Создает трекер вызовов.
const tracker = new assert.CallTracker();
function func() {}
// Возвращает функцию, обертывающую func(), которая должна быть вызвана точное время
// перед tracker.verify().
const callsfunc = tracker.calls(func);
сбрасывает вызовы трекера вызовов. если отслеживаемая функция передана в качестве аргумента, вызовы будут сброшены для нее. если аргументы не переданы, все отслеживаемые функции будут сброшены.
1 2 3 4 5 6 7 8 910111213
import assert from 'node:assert';
const tracker = new assert.CallTracker();
function func() {}
const callsfunc = tracker.calls(func);
callsfunc();
// Tracker was called once
tracker.getCalls(callsfunc).length === 1;
tracker.reset(callsfunc);
tracker.getCalls(callsfunc).length === 0;
1 2 3 4 5 6 7 8 91011
const assert = require('node:assert');
function func() {}
const callsfunc = tracker.calls(func);
callsfunc();
// Tracker was called once
tracker.getCalls(callsfunc).length === 1;
tracker.reset(callsfunc);
tracker.getCalls(callsfunc).length === 0;
Просматривает список функций, переданных в tracker.calls(), и выдает ошибку для функций, которые не были вызваны ожидаемое количество раз.
1 2 3 4 5 6 7 8 9101112131415
import assert from 'node:assert';
// Создает трекер вызовов.
const tracker = new assert.CallTracker();
function func() {}
// Возвращает функцию, обертывающую func(), которая должна быть вызвана точное время
// перед tracker.verify().
const callsfunc = tracker.calls(func, 2);
callsfunc();
// Выбросит ошибку, так как callsfunc() была вызвана только один раз.
tracker.verify();
1 2 3 4 5 6 7 8 9101112131415
const assert = require('node:assert');
// Создает трекер вызовов.
const tracker = new assert.CallTracker();
function func() {}
// Возвращает функцию, обертывающую func(), которая должна быть вызвана точное время
// перед tracker.verify().
const callsfunc = tracker.calls(func, 2);
callsfunc();
// Выбросит ошибку, так как callsfunc() была вызвана только один раз.
tracker.verify();
Принимаются только фиксы, связанные с безопасностью, производительностью или баг-фиксы. Пожалуйста, не предлагайте изменений АПИ в разделе с таким индикатором, они будут отклонены.
Проверяет глубокое равенство между параметрами actual и expected. Вместо этого используйте assert.deepStrictEqual(). assert.deepEqual() может привести к неожиданным результатам.
Глубокое равенство означает, что перечислимые "собственные" свойства дочерних объектов также рекурсивно оцениваются по следующим правилам.
Если значения не равны, возникает AssertionError со свойством message, установленным равным значению параметра message. Если параметр message не определен, назначается сообщение об ошибке по умолчанию. Если параметр message является экземпляром Error, то он будет выброшен вместо AssertionError.
Проверяет глубокое равенство между параметрами actual и expected. "Глубокое" равенство означает, что перечислимые "собственные" свойства дочерних объектов рекурсивно оцениваются также по следующим правилам.
import assert from 'node:assert/strict';
// This fails because 1 !== '1'.
assert.deepStrictEqual({ a: 1 }, { a: '1' });
// AssertionError: Expected inputs to be strictly deep-equal:
// + actual - expected
//
// {
// + a: 1
// - a: '1'
// }
// The following objects don't have own properties
const date = new Date();
const object = {};
const fakeDate = {};
Object.setPrototypeOf(fakeDate, Date.prototype);
// Different [[Prototype]]:
assert.deepStrictEqual(object, fakeDate);
// AssertionError: Expected inputs to be strictly deep-equal:
// + actual - expected
//
// + {}
// - Date {}
// Different type tags:
assert.deepStrictEqual(date, fakeDate);
// AssertionError: Expected inputs to be strictly deep-equal:
// + actual - expected
//
// + 2018-04-26T00:49:08.604Z
// - Date {}
assert.deepStrictEqual(NaN, NaN);
// OK because Object.is(NaN, NaN) is true.
// Different unwrapped numbers:
assert.deepStrictEqual(new Number(1), new Number(2));
// AssertionError: Expected inputs to be strictly deep-equal:
// + actual - expected
//
// + [Number: 1]
// - [Number: 2]
assert.deepStrictEqual(new String('foo'), Object('foo'));
// OK because the object and the string are identical when unwrapped.
assert.deepStrictEqual(-0, -0);
// OK
// Different zeros:
assert.deepStrictEqual(0, -0);
// AssertionError: Expected inputs to be strictly deep-equal:
// + actual - expected
//
// + 0
// - -0
const symbol1 = Symbol();
const symbol2 = Symbol();
assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol1]: 1 });
// OK, because it is the same symbol on both objects.
assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol2]: 1 });
// AssertionError [ERR_ASSERTION]: Inputs identical but not reference equal:
//
// {
// [Symbol()]: 1
// }
const weakMap1 = new WeakMap();
const weakMap2 = new WeakMap([[{}, {}]]);
const weakMap3 = new WeakMap();
weakMap3.unequal = true;
assert.deepStrictEqual(weakMap1, weakMap2);
// OK, because it is impossible to compare the entries
// Fails because weakMap3 has a property that weakMap1 does not contain:
assert.deepStrictEqual(weakMap1, weakMap3);
// AssertionError: Expected inputs to be strictly deep-equal:
// + actual - expected
//
// WeakMap {
// + [items unknown]
// - [items unknown],
// - unequal: true
// }
const assert = require('node:assert/strict');
// This fails because 1 !== '1'.
assert.deepStrictEqual({ a: 1 }, { a: '1' });
// AssertionError: Expected inputs to be strictly deep-equal:
// + actual - expected
//
// {
// + a: 1
// - a: '1'
// }
// The following objects don't have own properties
const date = new Date();
const object = {};
const fakeDate = {};
Object.setPrototypeOf(fakeDate, Date.prototype);
// Different [[Prototype]]:
assert.deepStrictEqual(object, fakeDate);
// AssertionError: Expected inputs to be strictly deep-equal:
// + actual - expected
//
// + {}
// - Date {}
// Different type tags:
assert.deepStrictEqual(date, fakeDate);
// AssertionError: Expected inputs to be strictly deep-equal:
// + actual - expected
//
// + 2018-04-26T00:49:08.604Z
// - Date {}
assert.deepStrictEqual(NaN, NaN);
// OK because Object.is(NaN, NaN) is true.
// Different unwrapped numbers:
assert.deepStrictEqual(new Number(1), new Number(2));
// AssertionError: Expected inputs to be strictly deep-equal:
// + actual - expected
//
// + [Number: 1]
// - [Number: 2]
assert.deepStrictEqual(new String('foo'), Object('foo'));
// OK because the object and the string are identical when unwrapped.
assert.deepStrictEqual(-0, -0);
// OK
// Different zeros:
assert.deepStrictEqual(0, -0);
// AssertionError: Expected inputs to be strictly deep-equal:
// + actual - expected
//
// + 0
// - -0
const symbol1 = Symbol();
const symbol2 = Symbol();
assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol1]: 1 });
// OK, because it is the same symbol on both objects.
assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol2]: 1 });
// AssertionError [ERR_ASSERTION]: Inputs identical but not reference equal:
//
// {
// [Symbol()]: 1
// }
const weakMap1 = new WeakMap();
const weakMap2 = new WeakMap([[{}, {}]]);
const weakMap3 = new WeakMap();
weakMap3.unequal = true;
assert.deepStrictEqual(weakMap1, weakMap2);
// OK, because it is impossible to compare the entries
// Fails because weakMap3 has a property that weakMap1 does not contain:
assert.deepStrictEqual(weakMap1, weakMap3);
// AssertionError: Expected inputs to be strictly deep-equal:
// + actual - expected
//
// WeakMap {
// + [items unknown]
// - [items unknown],
// - unequal: true
// }
Если значения не равны, возникает AssertionError со свойством message, установленным равным значению параметра message. Если параметр message не определен, назначается сообщение об ошибке по умолчанию. Если параметр message является экземпляром Error, то он будет выброшен вместо AssertionError.
Ожидает, что входная строка не будет соответствовать регулярному выражению.
1 2 3 4 5 6 7 8 910
import assert from 'node:assert/strict';
assert.doesNotMatch('I will fail', /fail/);
// AssertionError [ERR_ASSERTION]: Ожидалось, что входные данные не будут соответствовать ...
assert.doesNotMatch(123, /pass/);
// AssertionError [ERR_ASSERTION]: Аргумент "string" должен быть типа string.
assert.doesNotMatch('Я сдам', /different/);
// OK
1 2 3 4 5 6 7 8 910
const assert = require('node:assert/strict');
assert.doesNotMatch('I will fail', /fail/);
// AssertionError [ERR_ASSERTION]: Ожидалось, что входные данные не будут соответствовать ...
assert.doesNotMatch(123, /pass/);
// AssertionError [ERR_ASSERTION]: Аргумент "string" должен быть типа string.
assert.doesNotMatch('Я сдам', /different/);
// OK
Если значения совпадают, или аргумент string имеет тип, отличный от string, то возникает ошибка AssertionError со свойством message, равным значению параметра message. Если параметр message не определен, назначается сообщение об ошибке по умолчанию. Если параметр message является экземпляром Error, то он будет выброшен вместо AssertionError.
Ожидает промис asyncFn или, если asyncFn является функцией, немедленно вызывает функцию и ожидает выполнения возвращенного промиса. Затем проверяется, что промис не был отклонен.
Если asyncFn является функцией и синхронно выбрасывает ошибку, assert.doesNotReject() вернет отвергнутое Promise с этой ошибкой. Если функция не возвращает промис, assert.doesNotReject() вернет отклоненный Promise с ошибкой ERR_INVALID_RETURN_VALUE. В обоих случаях обработчик ошибки пропускается.
Использование assert.doesNotReject() на самом деле бесполезно, потому что мало пользы от перехвата отказа и последующего повторного отказа. Вместо этого следует добавить комментарий к определенному пути кода, который не должен отклоняться, и сделать сообщения об ошибках как можно более выразительными.
Использование assert.doesNotThrow() на самом деле бесполезно, потому что нет никакой пользы от перехвата ошибки и ее повторного выброса. Вместо этого следует добавить комментарий к определенному пути кода, который не должен выбрасывать ошибку, и сделать сообщения об ошибках как можно более выразительными.
Когда вызывается assert.doesNotThrow(), немедленно вызывается функция fn.
Если возникла ошибка, тип которой совпадает с типом, заданным параметром error, то возникает AssertionError. Если ошибка другого типа, или если параметр error не определен, то ошибка передается обратно вызывающей стороне.
Принимаются только фиксы, связанные с безопасностью, производительностью или баг-фиксы. Пожалуйста, не предлагайте изменений АПИ в разделе с таким индикатором, они будут отклонены.
Проверяет неглубокое, принудительное равенство между фактическим и ожидаемым параметрами, используя == оператор. Оператор NaN специально обрабатывается и рассматривается как идентичный, если обе стороны являются NaN.
Если значения не равны, возникает ошибка AssertionError со свойством message, равным значению параметра message. Если параметр message не определен, назначается сообщение об ошибке по умолчанию. Если параметр message является экземпляром Error, то он будет выброшен вместо AssertionError.
Выбрасывает AssertionError с предоставленным сообщением об ошибке или сообщением об ошибке по умолчанию. Если параметр message является экземпляром Error, то он будет выброшен вместо AssertionError.
Если message является falsy, сообщение об ошибке устанавливается как значения actual и expected, разделенные предоставленным оператором. Если указаны только два аргумента actual и expected, то operator по умолчанию будет равен '!='. Если в качестве третьего аргумента указано message, то оно будет использоваться в качестве сообщения об ошибке, а остальные аргументы будут сохранены как свойства брошенного объекта. Если указан stackStartFn, то все кадры стека выше этой функции будут удалены из трассировки стека (см. Error.captureStackTrace). Если аргументы не указаны, будет использовано сообщение по умолчанию Failed.
Выбрасывает value, если value не является undefined или null. Это полезно при проверке аргумента error в обратных вызовах. Трассировка стека содержит все кадры из ошибки, переданной в ifError(), включая потенциальные новые кадры для самой ifError().
1 2 3 4 5 6 7 8 91011121314151617181920212223
import assert from 'node:assert/strict';
assert.ifError(null);
// OK
assert.ifError(0);
// AssertionError [ERR_ASSERTION]: ifError получил нежелательное исключение: 0
assert.ifError('error');
// AssertionError [ERR_ASSERTION]: ifError получил нежелательное исключение: 'error'
assert.ifError(new Error());
// AssertionError [ERR_ASSERTION]: ifError получил нежелательное исключение: Error
// Создайте несколько случайных фреймов ошибок.
let err;
(function errorFrame() {
err = new Error('ошибка теста');
})();
(function ifErrorFrame() {
assert.ifError(err);
})();
// AssertionError [ERR_ASSERTION]: ifError получил нежелательное исключение: ошибка теста
// в ifErrorFrame
// в errorFrame
1 2 3 4 5 6 7 8 91011121314151617181920212223
const assert = require('node:assert/strict');
assert.ifError(null);
// OK
assert.ifError(0);
// AssertionError [ERR_ASSERTION]: ifError получил нежелательное исключение: 0
assert.ifError('error');
// AssertionError [ERR_ASSERTION]: ifError получил нежелательное исключение: 'error'
assert.ifError(new Error());
// AssertionError [ERR_ASSERTION]: ifError получил нежелательное исключение: Error
// Создайте несколько случайных фреймов ошибок.
let err;
(function errorFrame() {
err = new Error('ошибка теста');
})();
(function ifErrorFrame() {
assert.ifError(err);
})();
// AssertionError [ERR_ASSERTION]: ifError получил нежелательное исключение: ошибка теста
// в ifErrorFrame
// в errorFrame
Ожидает, что входная string будет соответствовать регулярному выражению.
1 2 3 4 5 6 7 8 910
import assert from 'node:assert/strict';
assert.match('I will fail', /pass/);
// AssertionError [ERR_ASSERTION]: Входные данные не соответствуют регулярному ...
assert.match(123, /pass/);
// AssertionError [ERR_ASSERTION]: Аргумент "string" должен быть типа string.
assert.match('I will pass', /pass/);
// OK
1 2 3 4 5 6 7 8 910
const assert = require('node:assert/strict');
assert.match('I will fail', /pass/);
// AssertionError [ERR_ASSERTION]: Входные данные не соответствуют регулярному ...
assert.match(123, /pass/);
// AssertionError [ERR_ASSERTION]: Аргумент "string" должен быть типа string.
assert.match('I will pass', /pass/);
// OK
Если значения не совпадают или аргумент string имеет тип, отличный от string, возникает ошибка AssertionError со свойством message, равным значению параметра message. Если параметр message не определен, назначается сообщение об ошибке по умолчанию. Если параметр message является экземпляром Error, то он будет выброшен вместо AssertionError.
Принимаются только фиксы, связанные с безопасностью, производительностью или баг-фиксы. Пожалуйста, не предлагайте изменений АПИ в разделе с таким индикатором, они будут отклонены.
Если значения глубоко равны, возникает ошибка AssertionError со свойством message, равным значению параметра message. Если параметр message не определен, назначается сообщение об ошибке по умолчанию. Если параметр message является экземпляром Error, то он будет выброшен вместо AssertionError.
Если значения глубоко и строго равны, то выбрасывается AssertionError со свойством message, установленным равным значению параметра message. Если параметр message не определен, назначается сообщение об ошибке по умолчанию. Если параметр message является экземпляром Error, то он будет выброшен вместо AssertionError.
Принимаются только фиксы, связанные с безопасностью, производительностью или баг-фиксы. Пожалуйста, не предлагайте изменений АПИ в разделе с таким индикатором, они будут отклонены.
Проверяет неглубокое принудительное неравенство с помощью оператора !=. NaN специально обрабатывается и рассматривается как идентичное, если обе стороны NaN.
Если значения равны, возникает AssertionError со свойством message, равным значению параметра message. Если параметр message не определен, назначается сообщение об ошибке по умолчанию. Если параметр message является экземпляром Error, то он будет выброшен вместо AssertionError.
Проверяет строгое неравенство между параметрами actual и expected, определяемое Object.is().
1 2 3 4 5 6 7 8 9101112
import assert from 'node:assert/strict';
assert.notStrictEqual(1, 2);
// OK
assert.notStrictEqual(1, 1);
// AssertionError [ERR_ASSERTION]: Ожидалось, что "actual" будет строго неравнозначно:
//
// 1
assert.notStrictEqual(1, '1');
// OK
1 2 3 4 5 6 7 8 9101112
const assert = require('node:assert/strict');
assert.notStrictEqual(1, 2);
// OK
assert.notStrictEqual(1, 1);
// AssertionError [ERR_ASSERTION]: Ожидалось, что "actual" будет строго неравнозначно:
//
// 1
assert.notStrictEqual(1, '1');
// OK
Если значения строго равны, возникает ошибка AssertionError со свойством message, равным значению параметра message. Если параметр message не определен, назначается сообщение об ошибке по умолчанию. Если параметр message является экземпляром Error, то он будет выброшен вместо AssertionError.
Проверяет, является ли значение истинным. Это эквивалентно assert.equal(!!value, true, message).
Если значение не является истинным, то возникает AssertionError со свойством message, равным значению параметра message. Если параметр message равен undefined, назначается сообщение об ошибке по умолчанию. Если параметр message является экземпляром Error, то он будет выброшен вместо AssertionError. Если аргументы не переданы вообще, то message будет установлен в строку: `Нет аргумента значения, переданного вassert.ok()```.
Имейте в виду, что в repl сообщение об ошибке будет отличаться от того, которое выводится в файле! Более подробную информацию смотрите ниже.
const assert = require('node:assert/strict');
assert.ok(true);
// OK
assert.ok(1);
// OK
assert.ok();
// AssertionError: В `assert.ok()` не передан аргумент value
assert.ok(false, "it's false");
// AssertionError: it's false
// В реплике:
assert.ok(typeof 123 === 'string');
// AssertionError: false == true
// В файле (например, test.js):
assert.ok(typeof 123 === 'string');
// AssertionError: Выражение оценивается в ложное значение:
//
// assert.ok(typeof 123 === 'string')
assert.ok(false);
// AssertionError: Выражение оценивается в ложное значение:
//
// assert.ok(false)
assert.ok(0);
// AssertionError: Выражение оценивается в ложное значение:
//
// assert.ok(0)
1234567
import assert from 'node:assert/strict';
// Использование `assert()` работает так же:
assert(0);
// AssertionError: Выражение оценивается в ложное значение:
//
// assert(0)
1234567
const assert = require('node:assert');
// Использование `assert()` работает так же:
assert(0);
// AssertionError: Выражение оценивается в ложное значение:
//
// assert(0)
Ожидает промис asyncFn или, если asyncFn является функцией, немедленно вызывает функцию и ожидает выполнения возвращенного промиса. Затем проверяется, что промис отклонен.
Если asyncFn является функцией и синхронно выбрасывает ошибку, assert.rejects() вернет отклоненное Promise с этой ошибкой. Если функция не возвращает промис, assert.rejects() вернет отклоненный Promise с ошибкой ERR_INVALID_RETURN_VALUE. В обоих случаях обработчик ошибки пропускается.
Помимо асинхронного характера ожидания, завершение ведет себя идентично assert.throws().
Если указано, то error может быть Class, RegExp, функцией проверки, объектом, где каждое свойство будет проверяться, или экземпляром ошибки, где каждое свойство будет проверяться, включая неперечислимые свойства message и name.
Если указано, message будет сообщением, предоставляемым AssertionError, если asyncFn не удастся отклонить.
error не может быть строкой. Если в качестве второго аргумента указана строка, то считается, что error опущен, и строка будет использована для message. Это может привести к легко пропущенным ошибкам. Пожалуйста, внимательно прочитайте пример в assert.throws(), если использование строки в качестве второго аргумента будет рассмотрено.
const assert = require('node:assert/strict');
assert.strictEqual(1, 2);
// AssertionError [ERR_ASSERTION]: Ожидалось, что входные данные будут строго равны:
//
// 1 !== 2
assert.strictEqual(1, 1);
// OK
assert.strictEqual('Hello foobar', 'Hello World!');
// AssertionError [ERR_ASSERTION]: Ожидается, что входные данные будут строго равны:
// + фактический - ожидаемый
//
// + 'Hello foobar'
// - 'Hello World!'
// ^
const apples = 1;
const oranges = 2;
assert.strictEqual(
apples,
oranges,
`apples ${apples} !== oranges ${oranges}`
);
// AssertionError [ERR_ASSERTION]: apples 1 !== oranges 2
assert.strictEqual(
1,
'1',
new TypeError('Входы не идентичны')
);
// TypeError: Входные данные не идентичны
Если значения не являются строго равными, возникает AssertionError со свойством message, установленным равным значению параметра message. Если параметр message не определен, назначается сообщение об ошибке по умолчанию. Если параметр message является экземпляром Error, то он будет выброшен вместо AssertionError.
Если указано, error может быть Class, RegExp, функцией проверки, объектом проверки, где каждое свойство будет проверяться на строгое равенство, или экземпляром ошибки, где каждое свойство будет проверяться на строгое равенство, включая неперечислимые свойства message и name. При использовании объекта можно также использовать регулярное выражение при проверке строкового свойства. Примеры смотрите ниже.
Если указано, message будет добавлено к сообщению, предоставленному AssertionError, если вызов fn не сможет бросить или если валидация ошибки не удалась.
Пользовательский объект валидации/экземпляр ошибки:
import assert from 'node:assert/strict';
const err = new TypeError('Wrong value');
err.code = 404;
err.foo = 'bar';
err.info = {
nested: true,
baz: 'text',
};
err.reg = /abc/i;
assert.throws(
() => {
throw err;
},
{
name: 'TypeError',
message: 'Wrong value',
info: {
nested: true,
baz: 'text',
},
// Only properties on the validation object will be tested for.
// Using nested objects requires all properties to be present. Otherwise
// the validation is going to fail.
}
);
// Using regular expressions to validate error properties:
assert.throws(
() => {
throw err;
},
{
// The `name` and `message` properties are strings and using regular
// expressions on those will match against the string. If they fail, an
// error is thrown.
name: /^TypeError$/,
message: /Wrong/,
foo: 'bar',
info: {
nested: true,
// It is not possible to use regular expressions for nested properties!
baz: 'text',
},
// The `reg` property contains a regular expression and only if the
// validation object contains an identical regular expression, it is going
// to pass.
reg: /abc/i,
}
);
// Fails due to the different `message` and `name` properties:
assert.throws(
() => {
const otherErr = new Error('Not found');
// Copy all enumerable properties from `err` to `otherErr`.
for (const [key, value] of Object.entries(err)) {
otherErr[key] = value;
}
throw otherErr;
},
// The error's `message` and `name` properties will also be checked when using
// an error as validation object.
err
);
const assert = require('node:assert/strict');
const err = new TypeError('Wrong value');
err.code = 404;
err.foo = 'bar';
err.info = {
nested: true,
baz: 'text',
};
err.reg = /abc/i;
assert.throws(
() => {
throw err;
},
{
name: 'TypeError',
message: 'Wrong value',
info: {
nested: true,
baz: 'text',
},
// Only properties on the validation object will be tested for.
// Using nested objects requires all properties to be present. Otherwise
// the validation is going to fail.
}
);
// Using regular expressions to validate error properties:
assert.throws(
() => {
throw err;
},
{
// The `name` and `message` properties are strings and using regular
// expressions on those will match against the string. If they fail, an
// error is thrown.
name: /^TypeError$/,
message: /Wrong/,
foo: 'bar',
info: {
nested: true,
// It is not possible to use regular expressions for nested properties!
baz: 'text',
},
// The `reg` property contains a regular expression and only if the
// validation object contains an identical regular expression, it is going
// to pass.
reg: /abc/i,
}
);
// Fails due to the different `message` and `name` properties:
assert.throws(
() => {
const otherErr = new Error('Not found');
// Copy all enumerable properties from `err` to `otherErr`.
for (const [key, value] of Object.entries(err)) {
otherErr[key] = value;
}
throw otherErr;
},
// The error's `message` and `name` properties will also be checked when using
// an error as validation object.
err
);
Проверьте instanceof с помощью конструктора:
12345
import assert from 'node:assert/strict';
assert.throws(() => {
throw new Error('Wrong value');
}, Error);
Функция должна возвращать true, чтобы показать, что все внутренние проверки пройдены. В противном случае она завершится с ошибкой AssertionError.
1 2 3 4 5 6 7 8 9101112131415161718
import assert from 'node:assert/strict';
assert.throws(
() => {
throw new Error('Wrong value');
},
(err) => {
assert(err instanceof Error);
assert(/value/.test(err));
// Avoid returning anything from validation functions besides `true`.
// Otherwise, it's not clear what part of the validation failed. Instead,
// throw an error about the specific validation that failed (as done in this
// example) and add as much helpful debugging information to that error as
// possible.
return true;
},
'unexpected error'
);
1 2 3 4 5 6 7 8 9101112131415161718
const assert = require('node:assert/strict');
assert.throws(
() => {
throw new Error('Wrong value');
},
(err) => {
assert(err instanceof Error);
assert(/value/.test(err));
// Avoid returning anything from validation functions besides `true`.
// Otherwise, it's not clear what part of the validation failed. Instead,
// throw an error about the specific validation that failed (as done in this
// example) and add as much helpful debugging information to that error as
// possible.
return true;
},
'unexpected error'
);
error не может быть строкой. Если в качестве второго аргумента указана строка, то считается, что error опущен, и строка будет использована для message. Это может привести к легко пропущенным ошибкам. Использование того же сообщения, что и брошенное сообщение об ошибке, приведет к ошибке ERR_AMBIGUOUS_ARGUMENT. Пожалуйста, внимательно прочитайте приведенный ниже пример, если в качестве второго аргумента будет использоваться строка:
import assert from 'node:assert/strict';
function throwingFirst() {
throw new Error('First');
}
function throwingSecond() {
throw new Error('Second');
}
function notThrowing() {}
// The second argument is a string and the input function threw an Error.
// The first case will not throw as it does not match for the error message
// thrown by the input function!
assert.throws(throwingFirst, 'Second');
// In the next example the message has no benefit over the message from the
// error and since it is not clear if the user intended to actually match
// against the error message, Node.js throws an `ERR_AMBIGUOUS_ARGUMENT` error.
assert.throws(throwingSecond, 'Second');
// TypeError [ERR_AMBIGUOUS_ARGUMENT]
// The string is only used (as message) in case the function does not throw:
assert.throws(notThrowing, 'Second');
// AssertionError [ERR_ASSERTION]: Missing expected exception: Second
// If it was intended to match for the error message do this instead:
// It does not throw because the error messages match.
assert.throws(throwingSecond, /Second$/);
// If the error message does not match, an AssertionError is thrown.
assert.throws(throwingFirst, /Second$/);
// AssertionError [ERR_ASSERTION]
const assert = require('node:assert/strict');
function throwingFirst() {
throw new Error('First');
}
function throwingSecond() {
throw new Error('Second');
}
function notThrowing() {}
// The second argument is a string and the input function threw an Error.
// The first case will not throw as it does not match for the error message
// thrown by the input function!
assert.throws(throwingFirst, 'Second');
// In the next example the message has no benefit over the message from the
// error and since it is not clear if the user intended to actually match
// against the error message, Node.js throws an `ERR_AMBIGUOUS_ARGUMENT` error.
assert.throws(throwingSecond, 'Second');
// TypeError [ERR_AMBIGUOUS_ARGUMENT]
// The string is only used (as message) in case the function does not throw:
assert.throws(notThrowing, 'Second');
// AssertionError [ERR_ASSERTION]: Missing expected exception: Second
// If it was intended to match for the error message do this instead:
// It does not throw because the error messages match.
assert.throws(throwingSecond, /Second$/);
// If the error message does not match, an AssertionError is thrown.
assert.throws(throwingFirst, /Second$/);
// AssertionError [ERR_ASSERTION]
Из-за запутанной нотации, приводящей к ошибкам, избегайте строки в качестве второго аргумента.