2012-02-27 20:07:12 +01:00
|
|
|
|
# Assert
|
2010-10-28 14:18:16 +02:00
|
|
|
|
|
2018-04-01 10:13:03 +02:00
|
|
|
|
<!--introduced_in=v0.1.21-->
|
2017-01-23 04:16:21 +01:00
|
|
|
|
|
2017-02-10 23:11:22 +01:00
|
|
|
|
> Stability: 2 - Stable
|
2012-03-03 00:14:03 +01:00
|
|
|
|
|
2019-06-14 18:03:24 +02:00
|
|
|
|
The `assert` module provides a set of assertion functions for verifying
|
2020-02-06 21:27:52 +01:00
|
|
|
|
invariants.
|
2018-04-01 10:11:24 +02:00
|
|
|
|
|
2020-02-04 18:41:55 +01:00
|
|
|
|
## Strict assertion mode
|
2017-11-13 21:15:24 +01:00
|
|
|
|
<!-- YAML
|
2018-03-18 14:45:41 +01:00
|
|
|
|
added: v9.9.0
|
2017-11-13 21:15:24 +01:00
|
|
|
|
changes:
|
2020-04-24 18:43:06 +02:00
|
|
|
|
- version:
|
|
|
|
|
- v13.9.0
|
|
|
|
|
- v12.16.2
|
2020-02-04 18:41:55 +01:00
|
|
|
|
description: Changed "strict mode" to "strict assertion mode" and "legacy
|
|
|
|
|
mode" to "legacy assertion mode" to avoid confusion with the
|
|
|
|
|
more usual meaining of "strict mode".
|
2018-03-18 14:45:41 +01:00
|
|
|
|
- version: v9.9.0
|
2018-02-04 16:30:04 +01:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/17615
|
2020-02-04 18:41:55 +01:00
|
|
|
|
description: Added error diffs to the strict assertion mode.
|
2018-03-18 14:45:41 +01:00
|
|
|
|
- version: v9.9.0
|
2017-11-13 21:15:24 +01:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/17002
|
2020-02-04 18:41:55 +01:00
|
|
|
|
description: Added strict assertion mode to the assert module.
|
2017-11-13 21:15:24 +01:00
|
|
|
|
-->
|
|
|
|
|
|
2020-02-06 21:27:52 +01:00
|
|
|
|
In strict assertion mode, non-strict methods behave like their corresponding
|
|
|
|
|
strict methods. For example, [`assert.deepEqual()`][] will behave like
|
|
|
|
|
[`assert.deepStrictEqual()`][].
|
2017-11-13 21:15:24 +01:00
|
|
|
|
|
2020-02-04 18:41:55 +01:00
|
|
|
|
In strict assertion mode, error messages for objects display a diff. In legacy
|
|
|
|
|
assertion mode, error messages for objects display the objects, often truncated.
|
2017-12-09 22:38:20 +01:00
|
|
|
|
|
2020-02-04 18:41:55 +01:00
|
|
|
|
To use strict assertion mode:
|
2017-11-13 21:15:24 +01:00
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const assert = require('assert').strict;
|
|
|
|
|
```
|
|
|
|
|
|
2018-04-26 03:06:10 +02:00
|
|
|
|
Example error diff:
|
2017-12-09 22:38:20 +01:00
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const assert = require('assert').strict;
|
|
|
|
|
|
|
|
|
|
assert.deepEqual([[[1, 2, 3]], 4, 5], [[[1, 2, '3']], 4, 5]);
|
2018-07-03 02:06:57 +02:00
|
|
|
|
// AssertionError: Expected inputs to be strictly deep-equal:
|
|
|
|
|
// + actual - expected ... Lines skipped
|
2018-04-26 03:06:10 +02:00
|
|
|
|
//
|
|
|
|
|
// [
|
|
|
|
|
// [
|
|
|
|
|
// ...
|
|
|
|
|
// 2,
|
2018-07-03 02:06:57 +02:00
|
|
|
|
// + 3
|
|
|
|
|
// - '3'
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// ],
|
|
|
|
|
// ...
|
|
|
|
|
// 5
|
|
|
|
|
// ]
|
2017-12-09 22:38:20 +01:00
|
|
|
|
```
|
|
|
|
|
|
2020-02-09 02:19:13 +01:00
|
|
|
|
To deactivate the colors, use the `NO_COLOR` or `NODE_DISABLE_COLORS`
|
|
|
|
|
environment variables. This will also deactivate the colors in the REPL. For
|
|
|
|
|
more on color support in terminal environments, read the tty
|
|
|
|
|
[getColorDepth()](tty.html#tty_writestream_getcolordepth_env) documentation.
|
2019-11-14 12:15:24 +01:00
|
|
|
|
|
2020-02-04 18:41:55 +01:00
|
|
|
|
## Legacy assertion mode
|
2017-11-13 21:15:24 +01:00
|
|
|
|
|
2020-02-04 18:41:55 +01:00
|
|
|
|
Legacy assertion mode uses the [Abstract Equality Comparison][] in:
|
2017-11-13 21:15:24 +01:00
|
|
|
|
|
2019-06-20 06:05:44 +02:00
|
|
|
|
* [`assert.deepEqual()`][]
|
|
|
|
|
* [`assert.equal()`][]
|
|
|
|
|
* [`assert.notDeepEqual()`][]
|
|
|
|
|
* [`assert.notEqual()`][]
|
|
|
|
|
|
2020-02-04 18:41:55 +01:00
|
|
|
|
To use legacy assertion mode:
|
2017-11-13 21:15:24 +01:00
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const assert = require('assert');
|
|
|
|
|
```
|
|
|
|
|
|
2020-02-04 18:41:55 +01:00
|
|
|
|
Whenever possible, use the [strict assertion mode][] instead. Otherwise, the
|
2019-06-20 06:05:44 +02:00
|
|
|
|
[Abstract Equality Comparison][] may cause surprising results. This is
|
2018-03-27 01:06:15 +02:00
|
|
|
|
especially true for [`assert.deepEqual()`][], where the comparison rules are
|
|
|
|
|
lax:
|
2017-11-13 21:15:24 +01:00
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
// WARNING: This does not throw an AssertionError!
|
|
|
|
|
assert.deepEqual(/a/gi, new Date());
|
|
|
|
|
```
|
|
|
|
|
|
2020-02-06 21:27:52 +01:00
|
|
|
|
## Class: assert.AssertionError
|
|
|
|
|
|
|
|
|
|
* Extends: {errors.Error}
|
|
|
|
|
|
|
|
|
|
Indicates the failure of an assertion. All errors thrown by the `assert` module
|
|
|
|
|
will be instances of the `AssertionError` class.
|
|
|
|
|
|
|
|
|
|
### `new assert.AssertionError(options)`
|
|
|
|
|
<!-- YAML
|
|
|
|
|
added: v0.1.21
|
|
|
|
|
-->
|
|
|
|
|
|
|
|
|
|
* `options` {Object}
|
|
|
|
|
* `message` {string} If provided, the error message is set to this value.
|
|
|
|
|
* `actual` {any} The `actual` property on the error instance.
|
|
|
|
|
* `expected` {any} The `expected` property on the error instance.
|
|
|
|
|
* `operator` {string} The `operator` property on the error instance.
|
|
|
|
|
* `stackStartFn` {Function} If provided, the generated stack trace omits
|
|
|
|
|
frames before this function.
|
|
|
|
|
|
|
|
|
|
A subclass of `Error` that indicates the failure of an assertion.
|
|
|
|
|
|
|
|
|
|
All instances contain the built-in `Error` properties (`message` and `name`)
|
|
|
|
|
and:
|
|
|
|
|
|
|
|
|
|
* `actual` {any} Set to the `actual` argument for methods such as
|
|
|
|
|
[`assert.strictEqual()`][].
|
|
|
|
|
* `expected` {any} Set to the `expected` value for methods such as
|
|
|
|
|
[`assert.strictEqual()`][].
|
|
|
|
|
* `generatedMessage` {boolean} Indicates if the message was auto-generated
|
|
|
|
|
(`true`) or not.
|
|
|
|
|
* `code` {string} Value is always `ERR_ASSERTION` to show that the error is an
|
|
|
|
|
assertion error.
|
|
|
|
|
* `operator` {string} Set to the passed in operator value.
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const assert = require('assert');
|
|
|
|
|
|
|
|
|
|
// Generate an AssertionError to compare the error message later:
|
|
|
|
|
const { message } = new assert.AssertionError({
|
|
|
|
|
actual: 1,
|
|
|
|
|
expected: 2,
|
|
|
|
|
operator: 'strictEqual'
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Verify error output:
|
|
|
|
|
try {
|
|
|
|
|
assert.strictEqual(1, 2);
|
|
|
|
|
} catch (err) {
|
|
|
|
|
assert(err instanceof assert.AssertionError);
|
|
|
|
|
assert.strictEqual(err.message, message);
|
|
|
|
|
assert.strictEqual(err.name, 'AssertionError');
|
|
|
|
|
assert.strictEqual(err.actual, 1);
|
|
|
|
|
assert.strictEqual(err.expected, 2);
|
|
|
|
|
assert.strictEqual(err.code, 'ERR_ASSERTION');
|
|
|
|
|
assert.strictEqual(err.operator, 'strictEqual');
|
|
|
|
|
assert.strictEqual(err.generatedMessage, true);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2020-02-27 12:41:05 +01:00
|
|
|
|
## Class: `assert.CallTracker`
|
2020-04-28 15:19:14 +02:00
|
|
|
|
<!-- YAML
|
2020-05-04 15:34:19 +02:00
|
|
|
|
added: v14.2.0
|
2020-04-28 15:19:14 +02:00
|
|
|
|
-->
|
|
|
|
|
|
|
|
|
|
> Stability: 1 - Experimental
|
|
|
|
|
|
|
|
|
|
This feature is currently experimental and behavior might still change.
|
2020-02-27 12:41:05 +01:00
|
|
|
|
|
|
|
|
|
### `new assert.CallTracker()`
|
|
|
|
|
<!-- YAML
|
2020-05-04 15:34:19 +02:00
|
|
|
|
added: v14.2.0
|
2020-02-27 12:41:05 +01:00
|
|
|
|
-->
|
|
|
|
|
|
|
|
|
|
Creates a new [`CallTracker`][] object which can be used to track if functions
|
|
|
|
|
were called a specific number of times. The `tracker.verify()` must be called
|
|
|
|
|
for the verification to take place. The usual pattern would be to call it in a
|
|
|
|
|
[`process.on('exit')`][] handler.
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const assert = require('assert');
|
|
|
|
|
|
|
|
|
|
const tracker = new assert.CallTracker();
|
|
|
|
|
|
|
|
|
|
function func() {}
|
|
|
|
|
|
|
|
|
|
// callsfunc() must be called exactly 1 time before tracker.verify().
|
|
|
|
|
const callsfunc = tracker.calls(func, 1);
|
|
|
|
|
|
|
|
|
|
callsfunc();
|
|
|
|
|
|
|
|
|
|
// Calls tracker.verify() and verifies if all tracker.calls() functions have
|
|
|
|
|
// been called exact times.
|
|
|
|
|
process.on('exit', () => {
|
|
|
|
|
tracker.verify();
|
|
|
|
|
});
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### `tracker.calls([fn][, exact])`
|
|
|
|
|
<!-- YAML
|
2020-05-04 15:34:19 +02:00
|
|
|
|
added: v14.2.0
|
2020-02-27 12:41:05 +01:00
|
|
|
|
-->
|
|
|
|
|
|
|
|
|
|
* `fn` {Function} **Default** A no-op function.
|
|
|
|
|
* `exact` {number} **Default** `1`.
|
|
|
|
|
* Returns: {Function} that wraps `fn`.
|
|
|
|
|
|
|
|
|
|
The wrapper function is expected to be called exactly `exact` times. If the
|
|
|
|
|
function has not been called exactly `exact` times when
|
|
|
|
|
[`tracker.verify()`][] is called, then [`tracker.verify()`][] will throw an
|
|
|
|
|
error.
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const assert = require('assert');
|
|
|
|
|
|
|
|
|
|
// Creates call tracker.
|
|
|
|
|
const tracker = new assert.CallTracker();
|
|
|
|
|
|
|
|
|
|
function func() {}
|
|
|
|
|
|
|
|
|
|
// Returns a function that wraps func() that must be called exact times
|
|
|
|
|
// before tracker.verify().
|
|
|
|
|
const callsfunc = tracker.calls(func);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### `tracker.report()`
|
|
|
|
|
<!-- YAML
|
2020-05-04 15:34:19 +02:00
|
|
|
|
added: v14.2.0
|
2020-02-27 12:41:05 +01:00
|
|
|
|
-->
|
|
|
|
|
|
|
|
|
|
* Returns: {Array} of objects containing information about the wrapper functions
|
|
|
|
|
returned by [`tracker.calls()`][].
|
|
|
|
|
* Object {Object}
|
|
|
|
|
* `message` {string}
|
|
|
|
|
* `actual` {number} The actual number of times the function was called.
|
|
|
|
|
* `expected` {number} The number of times the function was expected to be
|
|
|
|
|
called.
|
|
|
|
|
* `operator` {string} The name of the function that is wrapped.
|
|
|
|
|
* `stack` {Object} A stack trace of the function.
|
|
|
|
|
|
|
|
|
|
The arrays contains information about the expected and actual number of calls of
|
|
|
|
|
the functions that have not been called the expected number of times.
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const assert = require('assert');
|
|
|
|
|
|
|
|
|
|
// Creates call tracker.
|
|
|
|
|
const tracker = new assert.CallTracker();
|
|
|
|
|
|
|
|
|
|
function func() {}
|
|
|
|
|
|
|
|
|
|
function foo() {}
|
|
|
|
|
|
|
|
|
|
// Returns a function that wraps func() that must be called exact times
|
|
|
|
|
// before tracker.verify().
|
|
|
|
|
const callsfunc = tracker.calls(func, 2);
|
|
|
|
|
|
|
|
|
|
// Returns an array containing information on callsfunc()
|
|
|
|
|
tracker.report();
|
|
|
|
|
// [
|
|
|
|
|
// {
|
|
|
|
|
// message: 'Expected the func function to be executed 2 time(s) but was
|
|
|
|
|
// executed 0 time(s).',
|
|
|
|
|
// actual: 0,
|
|
|
|
|
// expected: 2,
|
|
|
|
|
// operator: 'func',
|
|
|
|
|
// stack: stack trace
|
|
|
|
|
// }
|
|
|
|
|
// ]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### `tracker.verify()`
|
|
|
|
|
<!-- YAML
|
2020-05-04 15:34:19 +02:00
|
|
|
|
added: v14.2.0
|
2020-02-27 12:41:05 +01:00
|
|
|
|
-->
|
|
|
|
|
|
|
|
|
|
Iterates through the list of functions passed to
|
|
|
|
|
[`tracker.calls()`][] and will throw an error for functions that
|
|
|
|
|
have not been called the expected number of times.
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const assert = require('assert');
|
|
|
|
|
|
|
|
|
|
// Creates call tracker.
|
|
|
|
|
const tracker = new assert.CallTracker();
|
|
|
|
|
|
|
|
|
|
function func() {}
|
|
|
|
|
|
|
|
|
|
// Returns a function that wraps func() that must be called exact times
|
|
|
|
|
// before tracker.verify().
|
|
|
|
|
const callsfunc = tracker.calls(func, 2);
|
|
|
|
|
|
|
|
|
|
callsfunc();
|
|
|
|
|
|
|
|
|
|
// Will throw an error since callsfunc() was only called once.
|
|
|
|
|
tracker.verify();
|
|
|
|
|
```
|
|
|
|
|
|
2019-12-23 21:27:50 +01:00
|
|
|
|
## `assert(value[, message])`
|
2016-05-11 08:08:33 +02:00
|
|
|
|
<!-- YAML
|
|
|
|
|
added: v0.5.9
|
|
|
|
|
-->
|
2019-09-06 07:42:22 +02:00
|
|
|
|
|
2018-05-02 16:13:16 +02:00
|
|
|
|
* `value` {any} The input that is checked for being truthy.
|
|
|
|
|
* `message` {string|Error}
|
2010-10-28 14:18:16 +02:00
|
|
|
|
|
2017-03-20 04:49:47 +01:00
|
|
|
|
An alias of [`assert.ok()`][].
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2019-12-23 21:27:50 +01:00
|
|
|
|
## `assert.deepEqual(actual, expected[, message])`
|
2016-05-11 08:08:33 +02:00
|
|
|
|
<!-- YAML
|
|
|
|
|
added: v0.1.21
|
2017-02-21 23:39:15 +01:00
|
|
|
|
changes:
|
2020-03-10 18:16:08 +01:00
|
|
|
|
- version: v14.0.0
|
2019-12-02 13:12:52 +01:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/30766
|
|
|
|
|
description: NaN is now treated as being identical in case both sides are
|
|
|
|
|
NaN.
|
2019-03-22 14:19:46 +01:00
|
|
|
|
- version: v12.0.0
|
2018-12-13 07:33:31 +01:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/25008
|
|
|
|
|
description: The type tags are now properly compared and there are a couple
|
|
|
|
|
minor comparison adjustments to make the check less surprising.
|
2017-09-01 18:50:47 +02:00
|
|
|
|
- version: v9.0.0
|
2017-08-26 00:18:23 +02:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/15001
|
2018-04-29 19:46:41 +02:00
|
|
|
|
description: The `Error` names and messages are now properly compared
|
2017-03-16 04:26:14 +01:00
|
|
|
|
- version: v8.0.0
|
2017-03-31 05:46:07 +02:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/12142
|
2018-04-29 19:46:41 +02:00
|
|
|
|
description: The `Set` and `Map` content is also compared
|
2017-02-21 23:39:15 +01:00
|
|
|
|
- version: v6.4.0, v4.7.1
|
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/8002
|
|
|
|
|
description: Typed array slices are handled correctly now.
|
|
|
|
|
- version: v6.1.0, v4.5.0
|
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/6432
|
|
|
|
|
description: Objects with circular references can be used as inputs now.
|
|
|
|
|
- version: v5.10.1, v4.4.3
|
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/5910
|
|
|
|
|
description: Handle non-`Uint8Array` typed arrays correctly.
|
2016-05-11 08:08:33 +02:00
|
|
|
|
-->
|
2019-09-06 07:42:22 +02:00
|
|
|
|
|
2017-02-25 08:17:53 +01:00
|
|
|
|
* `actual` {any}
|
|
|
|
|
* `expected` {any}
|
2018-05-02 16:13:16 +02:00
|
|
|
|
* `message` {string|Error}
|
2010-10-28 14:18:16 +02:00
|
|
|
|
|
2020-02-04 18:41:55 +01:00
|
|
|
|
**Strict assertion mode**
|
2017-11-13 21:15:24 +01:00
|
|
|
|
|
|
|
|
|
An alias of [`assert.deepStrictEqual()`][].
|
|
|
|
|
|
2020-02-04 18:41:55 +01:00
|
|
|
|
**Legacy assertion mode**
|
2017-11-13 21:15:24 +01:00
|
|
|
|
|
|
|
|
|
> Stability: 0 - Deprecated: Use [`assert.deepStrictEqual()`][] instead.
|
|
|
|
|
|
2018-12-13 07:33:31 +01:00
|
|
|
|
Tests for deep equality between the `actual` and `expected` parameters. Consider
|
|
|
|
|
using [`assert.deepStrictEqual()`][] instead. [`assert.deepEqual()`][] can have
|
2020-02-09 04:44:34 +01:00
|
|
|
|
surprising results.
|
2018-12-13 07:33:31 +01:00
|
|
|
|
|
2020-02-09 04:44:34 +01:00
|
|
|
|
_Deep equality_ means that the enumerable "own" properties of child objects
|
2018-12-13 07:33:31 +01:00
|
|
|
|
are also recursively evaluated by the following rules.
|
|
|
|
|
|
|
|
|
|
### Comparison details
|
|
|
|
|
|
|
|
|
|
* Primitive values are compared with the [Abstract Equality Comparison][]
|
2019-12-02 13:12:52 +01:00
|
|
|
|
( `==` ) with the exception of `NaN`. It is treated as being identical in case
|
|
|
|
|
both sides are `NaN`.
|
2018-12-13 07:33:31 +01:00
|
|
|
|
* [Type tags][Object.prototype.toString()] of objects should be the same.
|
|
|
|
|
* Only [enumerable "own" properties][] are considered.
|
|
|
|
|
* [`Error`][] names and messages are always compared, even if these are not
|
|
|
|
|
enumerable properties.
|
|
|
|
|
* [Object wrappers][] are compared both as objects and unwrapped values.
|
|
|
|
|
* `Object` properties are compared unordered.
|
|
|
|
|
* [`Map`][] keys and [`Set`][] items are compared unordered.
|
|
|
|
|
* Recursion stops when both sides differ or both sides encounter a circular
|
|
|
|
|
reference.
|
|
|
|
|
* Implementation does not test the [`[[Prototype]]`][prototype-spec] of
|
|
|
|
|
objects.
|
|
|
|
|
* [`Symbol`][] properties are not compared.
|
|
|
|
|
* [`WeakMap`][] and [`WeakSet`][] comparison does not rely on their values.
|
2017-02-02 23:02:29 +01:00
|
|
|
|
|
2019-06-20 17:13:31 +02:00
|
|
|
|
The following example does not throw an [`AssertionError`][] because the
|
|
|
|
|
primitives are considered equal by the [Abstract Equality Comparison][]
|
|
|
|
|
( `==` ).
|
2015-10-12 22:58:00 +02:00
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```js
|
|
|
|
|
// WARNING: This does not throw an AssertionError!
|
2018-12-13 07:33:31 +01:00
|
|
|
|
assert.deepEqual('+00000000', false);
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```
|
2010-10-28 14:18:16 +02:00
|
|
|
|
|
2015-12-20 04:08:13 +01:00
|
|
|
|
"Deep" equality means that the enumerable "own" properties of child objects
|
|
|
|
|
are evaluated also:
|
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```js
|
|
|
|
|
const assert = require('assert');
|
|
|
|
|
|
|
|
|
|
const obj1 = {
|
2017-04-21 16:38:31 +02:00
|
|
|
|
a: {
|
|
|
|
|
b: 1
|
2016-01-17 18:39:07 +01:00
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
const obj2 = {
|
2017-04-21 16:38:31 +02:00
|
|
|
|
a: {
|
|
|
|
|
b: 2
|
2016-01-17 18:39:07 +01:00
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
const obj3 = {
|
2017-04-21 16:38:31 +02:00
|
|
|
|
a: {
|
|
|
|
|
b: 1
|
2016-01-17 18:39:07 +01:00
|
|
|
|
}
|
2016-07-15 07:41:29 +02:00
|
|
|
|
};
|
2016-01-17 18:39:07 +01:00
|
|
|
|
const obj4 = Object.create(obj1);
|
|
|
|
|
|
|
|
|
|
assert.deepEqual(obj1, obj1);
|
2018-05-02 16:13:16 +02:00
|
|
|
|
// OK
|
2016-01-17 18:39:07 +01:00
|
|
|
|
|
2018-05-02 16:13:16 +02:00
|
|
|
|
// Values of b are different:
|
2016-01-17 18:39:07 +01:00
|
|
|
|
assert.deepEqual(obj1, obj2);
|
2016-11-08 21:04:57 +01:00
|
|
|
|
// AssertionError: { a: { b: 1 } } deepEqual { a: { b: 2 } }
|
2016-01-17 18:39:07 +01:00
|
|
|
|
|
|
|
|
|
assert.deepEqual(obj1, obj3);
|
2018-05-02 16:13:16 +02:00
|
|
|
|
// OK
|
2016-01-17 18:39:07 +01:00
|
|
|
|
|
2018-05-02 16:13:16 +02:00
|
|
|
|
// Prototypes are ignored:
|
2016-01-17 18:39:07 +01:00
|
|
|
|
assert.deepEqual(obj1, obj4);
|
2016-11-08 21:04:57 +01:00
|
|
|
|
// AssertionError: { a: { b: 1 } } deepEqual {}
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2019-06-20 17:13:31 +02:00
|
|
|
|
If the values are not equal, an [`AssertionError`][] is thrown with a `message`
|
2015-12-20 04:08:13 +01:00
|
|
|
|
property set equal to the value of the `message` parameter. If the `message`
|
2017-09-10 03:36:47 +02:00
|
|
|
|
parameter is undefined, a default error message is assigned. If the `message`
|
2017-11-13 19:44:30 +01:00
|
|
|
|
parameter is an instance of an [`Error`][] then it will be thrown instead of the
|
2019-06-20 17:13:31 +02:00
|
|
|
|
[`AssertionError`][].
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2019-12-23 21:27:50 +01:00
|
|
|
|
## `assert.deepStrictEqual(actual, expected[, message])`
|
2016-05-11 08:08:33 +02:00
|
|
|
|
<!-- YAML
|
|
|
|
|
added: v1.2.0
|
2017-02-21 23:39:15 +01:00
|
|
|
|
changes:
|
2017-09-01 18:50:47 +02:00
|
|
|
|
- version: v9.0.0
|
2017-08-19 07:06:27 +02:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/15169
|
|
|
|
|
description: Enumerable symbol properties are now compared.
|
2017-09-01 18:50:47 +02:00
|
|
|
|
- version: v9.0.0
|
2017-08-19 07:54:49 +02:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/15036
|
2018-04-29 19:46:41 +02:00
|
|
|
|
description: The `NaN` is now compared using the
|
2018-02-12 08:31:55 +01:00
|
|
|
|
[SameValueZero](https://tc39.github.io/ecma262/#sec-samevaluezero)
|
|
|
|
|
comparison.
|
2017-09-10 04:58:50 +02:00
|
|
|
|
- version: v8.5.0
|
2017-09-13 10:50:43 +02:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/15001
|
2018-04-29 19:46:41 +02:00
|
|
|
|
description: The `Error` names and messages are now properly compared
|
2017-03-16 04:26:14 +01:00
|
|
|
|
- version: v8.0.0
|
2017-03-31 05:46:07 +02:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/12142
|
2018-04-29 19:46:41 +02:00
|
|
|
|
description: The `Set` and `Map` content is also compared
|
2017-02-21 23:39:15 +01:00
|
|
|
|
- version: v6.4.0, v4.7.1
|
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/8002
|
|
|
|
|
description: Typed array slices are handled correctly now.
|
|
|
|
|
- version: v6.1.0
|
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/6432
|
|
|
|
|
description: Objects with circular references can be used as inputs now.
|
|
|
|
|
- version: v5.10.1, v4.4.3
|
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/5910
|
|
|
|
|
description: Handle non-`Uint8Array` typed arrays correctly.
|
2016-05-11 08:08:33 +02:00
|
|
|
|
-->
|
2019-09-06 07:42:22 +02:00
|
|
|
|
|
2017-02-25 08:17:53 +01:00
|
|
|
|
* `actual` {any}
|
|
|
|
|
* `expected` {any}
|
2018-05-02 16:13:16 +02:00
|
|
|
|
* `message` {string|Error}
|
2015-11-04 16:48:45 +01:00
|
|
|
|
|
2017-11-13 19:44:30 +01:00
|
|
|
|
Tests for deep equality between the `actual` and `expected` parameters.
|
|
|
|
|
"Deep" equality means that the enumerable "own" properties of child objects
|
|
|
|
|
are recursively evaluated also by the following rules.
|
2017-02-02 23:02:29 +01:00
|
|
|
|
|
2017-11-13 19:44:30 +01:00
|
|
|
|
### Comparison details
|
|
|
|
|
|
|
|
|
|
* Primitive values are compared using the [SameValue Comparison][], used by
|
|
|
|
|
[`Object.is()`][].
|
|
|
|
|
* [Type tags][Object.prototype.toString()] of objects should be the same.
|
|
|
|
|
* [`[[Prototype]]`][prototype-spec] of objects are compared using
|
2017-11-13 21:15:24 +01:00
|
|
|
|
the [Strict Equality Comparison][].
|
2017-11-13 19:44:30 +01:00
|
|
|
|
* Only [enumerable "own" properties][] are considered.
|
|
|
|
|
* [`Error`][] names and messages are always compared, even if these are not
|
|
|
|
|
enumerable properties.
|
|
|
|
|
* Enumerable own [`Symbol`][] properties are compared as well.
|
|
|
|
|
* [Object wrappers][] are compared both as objects and unwrapped values.
|
2018-04-29 19:46:41 +02:00
|
|
|
|
* `Object` properties are compared unordered.
|
2018-12-13 07:33:31 +01:00
|
|
|
|
* [`Map`][] keys and [`Set`][] items are compared unordered.
|
2017-11-13 19:44:30 +01:00
|
|
|
|
* Recursion stops when both sides differ or both sides encounter a circular
|
|
|
|
|
reference.
|
2018-01-19 11:03:02 +01:00
|
|
|
|
* [`WeakMap`][] and [`WeakSet`][] comparison does not rely on their values. See
|
|
|
|
|
below for further details.
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```js
|
2017-11-13 21:15:24 +01:00
|
|
|
|
const assert = require('assert').strict;
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// This fails because 1 !== '1'.
|
2017-06-01 01:07:25 +02:00
|
|
|
|
assert.deepStrictEqual({ a: 1 }, { a: '1' });
|
2018-07-03 02:06:57 +02:00
|
|
|
|
// AssertionError: Expected inputs to be strictly deep-equal:
|
|
|
|
|
// + actual - expected
|
|
|
|
|
//
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// {
|
2018-07-03 02:06:57 +02:00
|
|
|
|
// + a: 1
|
|
|
|
|
// - a: '1'
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// }
|
2017-01-31 20:51:54 +01:00
|
|
|
|
|
|
|
|
|
// The following objects don't have own properties
|
|
|
|
|
const date = new Date();
|
|
|
|
|
const object = {};
|
|
|
|
|
const fakeDate = {};
|
|
|
|
|
Object.setPrototypeOf(fakeDate, Date.prototype);
|
|
|
|
|
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// Different [[Prototype]]:
|
2017-01-31 20:51:54 +01:00
|
|
|
|
assert.deepStrictEqual(object, fakeDate);
|
2018-07-03 02:06:57 +02:00
|
|
|
|
// AssertionError: Expected inputs to be strictly deep-equal:
|
|
|
|
|
// + actual - expected
|
|
|
|
|
//
|
|
|
|
|
// + {}
|
|
|
|
|
// - Date {}
|
2017-01-31 20:51:54 +01:00
|
|
|
|
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// Different type tags:
|
2017-01-31 20:51:54 +01:00
|
|
|
|
assert.deepStrictEqual(date, fakeDate);
|
2018-07-03 02:06:57 +02:00
|
|
|
|
// AssertionError: Expected inputs to be strictly deep-equal:
|
|
|
|
|
// + actual - expected
|
|
|
|
|
//
|
|
|
|
|
// + 2018-04-26T00:49:08.604Z
|
|
|
|
|
// - Date {}
|
2017-08-27 03:44:07 +02:00
|
|
|
|
|
2017-08-19 07:54:49 +02:00
|
|
|
|
assert.deepStrictEqual(NaN, NaN);
|
2017-11-13 19:44:30 +01:00
|
|
|
|
// OK, because of the SameValue comparison
|
2017-08-27 03:44:07 +02:00
|
|
|
|
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// Different unwrapped numbers:
|
2017-08-27 03:44:07 +02:00
|
|
|
|
assert.deepStrictEqual(new Number(1), new Number(2));
|
2018-07-03 02:06:57 +02:00
|
|
|
|
// AssertionError: Expected inputs to be strictly deep-equal:
|
|
|
|
|
// + actual - expected
|
|
|
|
|
//
|
|
|
|
|
// + [Number: 1]
|
|
|
|
|
// - [Number: 2]
|
2018-04-26 03:06:10 +02:00
|
|
|
|
|
2017-08-27 03:44:07 +02:00
|
|
|
|
assert.deepStrictEqual(new String('foo'), Object('foo'));
|
|
|
|
|
// OK because the object and the string are identical when unwrapped.
|
2017-08-19 07:50:57 +02:00
|
|
|
|
|
|
|
|
|
assert.deepStrictEqual(-0, -0);
|
|
|
|
|
// OK
|
2018-04-26 03:06:10 +02:00
|
|
|
|
|
|
|
|
|
// Different zeros using the SameValue Comparison:
|
2017-08-19 07:50:57 +02:00
|
|
|
|
assert.deepStrictEqual(0, -0);
|
2018-07-03 02:06:57 +02:00
|
|
|
|
// AssertionError: Expected inputs to be strictly deep-equal:
|
|
|
|
|
// + actual - expected
|
|
|
|
|
//
|
|
|
|
|
// + 0
|
|
|
|
|
// - -0
|
2017-08-19 07:06:27 +02:00
|
|
|
|
|
|
|
|
|
const symbol1 = Symbol();
|
|
|
|
|
const symbol2 = Symbol();
|
|
|
|
|
assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol1]: 1 });
|
|
|
|
|
// OK, because it is the same symbol on both objects.
|
2018-07-03 02:06:57 +02:00
|
|
|
|
|
2017-08-19 07:06:27 +02:00
|
|
|
|
assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol2]: 1 });
|
2018-07-03 02:06:57 +02:00
|
|
|
|
// AssertionError [ERR_ASSERTION]: Inputs identical but not reference equal:
|
|
|
|
|
//
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// {
|
|
|
|
|
// [Symbol()]: 1
|
|
|
|
|
// }
|
2018-01-19 11:03:02 +01:00
|
|
|
|
|
|
|
|
|
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
|
2018-04-26 03:06:10 +02:00
|
|
|
|
|
|
|
|
|
// Fails because weakMap3 has a property that weakMap1 does not contain:
|
2018-01-19 11:03:02 +01:00
|
|
|
|
assert.deepStrictEqual(weakMap1, weakMap3);
|
2018-07-03 02:06:57 +02:00
|
|
|
|
// AssertionError: Expected inputs to be strictly deep-equal:
|
|
|
|
|
// + actual - expected
|
|
|
|
|
//
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// WeakMap {
|
2018-07-03 02:06:57 +02:00
|
|
|
|
// + [items unknown]
|
|
|
|
|
// - [items unknown],
|
|
|
|
|
// - unequal: true
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// }
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2019-06-20 17:13:31 +02:00
|
|
|
|
If the values are not equal, an [`AssertionError`][] is thrown with a `message`
|
2015-12-20 04:08:13 +01:00
|
|
|
|
property set equal to the value of the `message` parameter. If the `message`
|
2017-09-10 03:36:47 +02:00
|
|
|
|
parameter is undefined, a default error message is assigned. If the `message`
|
2017-11-13 19:44:30 +01:00
|
|
|
|
parameter is an instance of an [`Error`][] then it will be thrown instead of the
|
2017-09-10 03:36:47 +02:00
|
|
|
|
`AssertionError`.
|
2015-11-04 16:48:45 +01:00
|
|
|
|
|
2019-12-12 22:51:43 +01:00
|
|
|
|
## `assert.doesNotMatch(string, regexp[, message])`
|
|
|
|
|
<!-- YAML
|
2020-04-24 18:43:06 +02:00
|
|
|
|
added:
|
|
|
|
|
- v13.6.0
|
|
|
|
|
- v12.16.0
|
2019-12-12 22:51:43 +01:00
|
|
|
|
-->
|
|
|
|
|
|
|
|
|
|
* `string` {string}
|
|
|
|
|
* `regexp` {RegExp}
|
|
|
|
|
* `message` {string|Error}
|
|
|
|
|
|
|
|
|
|
> Stability: 1 - Experimental
|
|
|
|
|
|
|
|
|
|
Expects the `string` input not to match the regular expression.
|
|
|
|
|
|
|
|
|
|
This feature is currently experimental and the name might change or it might be
|
|
|
|
|
completely removed again.
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const assert = require('assert').strict;
|
|
|
|
|
|
|
|
|
|
assert.doesNotMatch('I will fail', /fail/);
|
|
|
|
|
// AssertionError [ERR_ASSERTION]: The input was expected to not match the ...
|
|
|
|
|
|
|
|
|
|
assert.doesNotMatch(123, /pass/);
|
|
|
|
|
// AssertionError [ERR_ASSERTION]: The "string" argument must be of type string.
|
|
|
|
|
|
|
|
|
|
assert.doesNotMatch('I will pass', /different/);
|
|
|
|
|
// OK
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
If the values do match, or if the `string` argument is of another type than
|
|
|
|
|
`string`, an [`AssertionError`][] is thrown with a `message` property set equal
|
|
|
|
|
to the value of the `message` parameter. If the `message` parameter is
|
|
|
|
|
undefined, a default error message is assigned. If the `message` parameter is an
|
|
|
|
|
instance of an [`Error`][] then it will be thrown instead of the
|
|
|
|
|
[`AssertionError`][].
|
|
|
|
|
|
2019-12-23 21:27:50 +01:00
|
|
|
|
## `assert.doesNotReject(asyncFn[, error][, message])`
|
2018-01-12 00:16:41 +01:00
|
|
|
|
<!-- YAML
|
2018-03-02 18:53:46 +01:00
|
|
|
|
added: v10.0.0
|
2018-01-12 00:16:41 +01:00
|
|
|
|
-->
|
2019-09-06 07:42:22 +02:00
|
|
|
|
|
2018-09-04 01:10:29 +02:00
|
|
|
|
* `asyncFn` {Function|Promise}
|
2018-01-12 00:16:41 +01:00
|
|
|
|
* `error` {RegExp|Function}
|
2018-09-04 01:10:29 +02:00
|
|
|
|
* `message` {string}
|
2018-01-12 00:16:41 +01:00
|
|
|
|
|
2018-09-04 01:10:29 +02:00
|
|
|
|
Awaits the `asyncFn` promise or, if `asyncFn` is a function, immediately
|
|
|
|
|
calls the function and awaits the returned promise to complete. It will then
|
|
|
|
|
check that the promise is not rejected.
|
2018-04-08 23:28:30 +02:00
|
|
|
|
|
2018-09-04 01:10:29 +02:00
|
|
|
|
If `asyncFn` is a function and it throws an error synchronously,
|
2018-04-29 19:46:41 +02:00
|
|
|
|
`assert.doesNotReject()` will return a rejected `Promise` with that error. If
|
|
|
|
|
the function does not return a promise, `assert.doesNotReject()` will return a
|
|
|
|
|
rejected `Promise` with an [`ERR_INVALID_RETURN_VALUE`][] error. In both cases
|
|
|
|
|
the error handler is skipped.
|
2018-03-12 22:15:49 +01:00
|
|
|
|
|
2018-10-26 18:27:40 +02:00
|
|
|
|
Using `assert.doesNotReject()` is actually not useful because there is little
|
|
|
|
|
benefit in catching a rejection and then rejecting it again. Instead, consider
|
|
|
|
|
adding a comment next to the specific code path that should not reject and keep
|
|
|
|
|
error messages as expressive as possible.
|
2018-01-12 00:16:41 +01:00
|
|
|
|
|
2018-04-09 01:31:59 +02:00
|
|
|
|
If specified, `error` can be a [`Class`][], [`RegExp`][] or a validation
|
|
|
|
|
function. See [`assert.throws()`][] for more details.
|
|
|
|
|
|
2018-03-11 13:05:04 +01:00
|
|
|
|
Besides the async nature to await the completion behaves identically to
|
2018-01-12 00:16:41 +01:00
|
|
|
|
[`assert.doesNotThrow()`][].
|
|
|
|
|
|
2019-04-25 00:46:40 +02:00
|
|
|
|
<!-- eslint-disable no-restricted-syntax -->
|
2018-01-12 00:16:41 +01:00
|
|
|
|
```js
|
|
|
|
|
(async () => {
|
|
|
|
|
await assert.doesNotReject(
|
|
|
|
|
async () => {
|
|
|
|
|
throw new TypeError('Wrong value');
|
|
|
|
|
},
|
|
|
|
|
SyntaxError
|
|
|
|
|
);
|
|
|
|
|
})();
|
|
|
|
|
```
|
|
|
|
|
|
2019-04-25 00:46:40 +02:00
|
|
|
|
<!-- eslint-disable no-restricted-syntax -->
|
2018-01-12 00:16:41 +01:00
|
|
|
|
```js
|
2018-04-08 23:28:30 +02:00
|
|
|
|
assert.doesNotReject(Promise.reject(new TypeError('Wrong value')))
|
|
|
|
|
.then(() => {
|
|
|
|
|
// ...
|
|
|
|
|
});
|
2018-01-12 00:16:41 +01:00
|
|
|
|
```
|
|
|
|
|
|
2019-12-23 21:27:50 +01:00
|
|
|
|
## `assert.doesNotThrow(fn[, error][, message])`
|
2016-05-11 08:08:33 +02:00
|
|
|
|
<!-- YAML
|
|
|
|
|
added: v0.1.21
|
2017-02-21 23:39:15 +01:00
|
|
|
|
changes:
|
|
|
|
|
- version: v5.11.0, v4.4.5
|
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/2407
|
|
|
|
|
description: The `message` parameter is respected now.
|
|
|
|
|
- version: v4.2.0
|
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/3276
|
|
|
|
|
description: The `error` parameter can now be an arrow function.
|
2016-05-11 08:08:33 +02:00
|
|
|
|
-->
|
2019-09-06 07:42:22 +02:00
|
|
|
|
|
2018-09-04 01:10:29 +02:00
|
|
|
|
* `fn` {Function}
|
2017-02-25 08:17:53 +01:00
|
|
|
|
* `error` {RegExp|Function}
|
2018-09-04 01:10:29 +02:00
|
|
|
|
* `message` {string}
|
2015-11-04 16:48:45 +01:00
|
|
|
|
|
2018-09-04 01:10:29 +02:00
|
|
|
|
Asserts that the function `fn` does not throw an error.
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2018-10-26 18:27:40 +02:00
|
|
|
|
Using `assert.doesNotThrow()` is actually not useful because there
|
|
|
|
|
is no benefit in catching an error and then rethrowing it. Instead, consider
|
2018-02-10 16:50:20 +01:00
|
|
|
|
adding a comment next to the specific code path that should not throw and keep
|
|
|
|
|
error messages as expressive as possible.
|
|
|
|
|
|
2018-09-04 01:10:29 +02:00
|
|
|
|
When `assert.doesNotThrow()` is called, it will immediately call the `fn`
|
2015-12-20 04:08:13 +01:00
|
|
|
|
function.
|
|
|
|
|
|
|
|
|
|
If an error is thrown and it is the same type as that specified by the `error`
|
2019-06-20 17:13:31 +02:00
|
|
|
|
parameter, then an [`AssertionError`][] is thrown. If the error is of a
|
|
|
|
|
different type, or if the `error` parameter is undefined, the error is
|
|
|
|
|
propagated back to the caller.
|
2015-11-04 16:48:45 +01:00
|
|
|
|
|
2018-04-09 01:31:59 +02:00
|
|
|
|
If specified, `error` can be a [`Class`][], [`RegExp`][] or a validation
|
|
|
|
|
function. See [`assert.throws()`][] for more details.
|
|
|
|
|
|
2015-12-20 04:08:13 +01:00
|
|
|
|
The following, for instance, will throw the [`TypeError`][] because there is no
|
|
|
|
|
matching error type in the assertion:
|
2015-11-04 16:48:45 +01:00
|
|
|
|
|
2018-02-12 12:25:04 +01:00
|
|
|
|
<!-- eslint-disable no-restricted-syntax -->
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```js
|
|
|
|
|
assert.doesNotThrow(
|
2016-01-24 10:15:51 +01:00
|
|
|
|
() => {
|
2016-01-17 18:39:07 +01:00
|
|
|
|
throw new TypeError('Wrong value');
|
|
|
|
|
},
|
|
|
|
|
SyntaxError
|
|
|
|
|
);
|
|
|
|
|
```
|
2015-11-04 16:48:45 +01:00
|
|
|
|
|
2019-06-20 17:13:31 +02:00
|
|
|
|
However, the following will result in an [`AssertionError`][] with the message
|
2018-04-29 19:46:41 +02:00
|
|
|
|
'Got unwanted exception...':
|
2015-11-04 16:48:45 +01:00
|
|
|
|
|
2018-02-12 12:25:04 +01:00
|
|
|
|
<!-- eslint-disable no-restricted-syntax -->
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```js
|
|
|
|
|
assert.doesNotThrow(
|
2016-01-24 10:15:51 +01:00
|
|
|
|
() => {
|
2016-01-17 18:39:07 +01:00
|
|
|
|
throw new TypeError('Wrong value');
|
|
|
|
|
},
|
|
|
|
|
TypeError
|
|
|
|
|
);
|
|
|
|
|
```
|
2015-11-04 16:48:45 +01:00
|
|
|
|
|
2019-06-20 17:13:31 +02:00
|
|
|
|
If an [`AssertionError`][] is thrown and a value is provided for the `message`
|
|
|
|
|
parameter, the value of `message` will be appended to the [`AssertionError`][]
|
2015-12-20 04:08:13 +01:00
|
|
|
|
message:
|
|
|
|
|
|
2018-02-12 12:25:04 +01:00
|
|
|
|
<!-- eslint-disable no-restricted-syntax -->
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```js
|
|
|
|
|
assert.doesNotThrow(
|
2016-01-24 10:15:51 +01:00
|
|
|
|
() => {
|
2016-01-17 18:39:07 +01:00
|
|
|
|
throw new TypeError('Wrong value');
|
|
|
|
|
},
|
2018-04-09 01:31:59 +02:00
|
|
|
|
/Wrong value/,
|
2016-01-17 18:39:07 +01:00
|
|
|
|
'Whoops'
|
|
|
|
|
);
|
2018-04-29 19:46:41 +02:00
|
|
|
|
// Throws: AssertionError: Got unwanted exception: Whoops
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2019-12-23 21:27:50 +01:00
|
|
|
|
## `assert.equal(actual, expected[, message])`
|
2016-05-11 08:08:33 +02:00
|
|
|
|
<!-- YAML
|
|
|
|
|
added: v0.1.21
|
2019-12-02 13:12:52 +01:00
|
|
|
|
changes:
|
2020-03-10 18:16:08 +01:00
|
|
|
|
- version: v14.0.0
|
2019-12-02 13:12:52 +01:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/30766
|
|
|
|
|
description: NaN is now treated as being identical in case both sides are
|
|
|
|
|
NaN.
|
2016-05-11 08:08:33 +02:00
|
|
|
|
-->
|
2019-09-06 07:42:22 +02:00
|
|
|
|
|
2017-02-25 08:17:53 +01:00
|
|
|
|
* `actual` {any}
|
|
|
|
|
* `expected` {any}
|
2018-05-02 16:13:16 +02:00
|
|
|
|
* `message` {string|Error}
|
2015-11-04 16:48:45 +01:00
|
|
|
|
|
2020-02-04 18:41:55 +01:00
|
|
|
|
**Strict assertion mode**
|
2017-11-13 21:15:24 +01:00
|
|
|
|
|
|
|
|
|
An alias of [`assert.strictEqual()`][].
|
|
|
|
|
|
2020-02-04 18:41:55 +01:00
|
|
|
|
**Legacy assertion mode**
|
2017-11-13 21:15:24 +01:00
|
|
|
|
|
|
|
|
|
> Stability: 0 - Deprecated: Use [`assert.strictEqual()`][] instead.
|
|
|
|
|
|
2015-12-20 04:08:13 +01:00
|
|
|
|
Tests shallow, coercive equality between the `actual` and `expected` parameters
|
2019-12-02 13:12:52 +01:00
|
|
|
|
using the [Abstract Equality Comparison][] ( `==` ). `NaN` is special handled
|
|
|
|
|
and treated as being identical in case both sides are `NaN`.
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```js
|
|
|
|
|
const assert = require('assert');
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
assert.equal(1, 1);
|
2016-11-08 21:04:57 +01:00
|
|
|
|
// OK, 1 == 1
|
2016-01-17 18:39:07 +01:00
|
|
|
|
assert.equal(1, '1');
|
2016-11-08 21:04:57 +01:00
|
|
|
|
// OK, 1 == '1'
|
2019-12-02 13:12:52 +01:00
|
|
|
|
assert.equal(NaN, NaN);
|
|
|
|
|
// OK
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
assert.equal(1, 2);
|
2016-11-08 21:04:57 +01:00
|
|
|
|
// AssertionError: 1 == 2
|
2017-06-01 01:07:25 +02:00
|
|
|
|
assert.equal({ a: { b: 1 } }, { a: { b: 1 } });
|
2018-03-25 16:27:38 +02:00
|
|
|
|
// AssertionError: { a: { b: 1 } } == { a: { b: 1 } }
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2019-06-20 17:13:31 +02:00
|
|
|
|
If the values are not equal, an [`AssertionError`][] is thrown with a `message`
|
2015-12-20 04:08:13 +01:00
|
|
|
|
property set equal to the value of the `message` parameter. If the `message`
|
2017-09-10 03:36:47 +02:00
|
|
|
|
parameter is undefined, a default error message is assigned. If the `message`
|
2017-11-13 19:44:30 +01:00
|
|
|
|
parameter is an instance of an [`Error`][] then it will be thrown instead of the
|
2017-09-10 03:36:47 +02:00
|
|
|
|
`AssertionError`.
|
2015-11-04 16:48:45 +01:00
|
|
|
|
|
2019-12-23 21:27:50 +01:00
|
|
|
|
## `assert.fail([message])`
|
2018-01-28 12:07:18 +01:00
|
|
|
|
<!-- YAML
|
|
|
|
|
added: v0.1.21
|
|
|
|
|
-->
|
2019-09-06 07:42:22 +02:00
|
|
|
|
|
2018-05-02 16:13:16 +02:00
|
|
|
|
* `message` {string|Error} **Default:** `'Failed'`
|
2018-01-28 12:07:18 +01:00
|
|
|
|
|
2019-06-20 17:13:31 +02:00
|
|
|
|
Throws an [`AssertionError`][] with the provided error message or a default
|
|
|
|
|
error message. If the `message` parameter is an instance of an [`Error`][] then
|
|
|
|
|
it will be thrown instead of the [`AssertionError`][].
|
2018-01-28 12:07:18 +01:00
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const assert = require('assert').strict;
|
|
|
|
|
|
|
|
|
|
assert.fail();
|
|
|
|
|
// AssertionError [ERR_ASSERTION]: Failed
|
|
|
|
|
|
|
|
|
|
assert.fail('boom');
|
|
|
|
|
// AssertionError [ERR_ASSERTION]: boom
|
|
|
|
|
|
|
|
|
|
assert.fail(new TypeError('need array'));
|
|
|
|
|
// TypeError: need array
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Using `assert.fail()` with more than two arguments is possible but deprecated.
|
|
|
|
|
See below for further details.
|
|
|
|
|
|
2019-12-23 21:27:50 +01:00
|
|
|
|
## `assert.fail(actual, expected[, message[, operator[, stackStartFn]]])`
|
2016-05-11 08:08:33 +02:00
|
|
|
|
<!-- YAML
|
|
|
|
|
added: v0.1.21
|
2018-01-28 12:07:18 +01:00
|
|
|
|
changes:
|
2018-03-02 18:53:46 +01:00
|
|
|
|
- version: v10.0.0
|
2018-02-04 16:30:04 +01:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/18418
|
2018-04-09 18:30:22 +02:00
|
|
|
|
description: Calling `assert.fail()` with more than one argument is
|
|
|
|
|
deprecated and emits a warning.
|
2016-05-11 08:08:33 +02:00
|
|
|
|
-->
|
2019-09-06 07:42:22 +02:00
|
|
|
|
|
2019-10-01 17:57:09 +02:00
|
|
|
|
> Stability: 0 - Deprecated: Use `assert.fail([message])` or other assert
|
|
|
|
|
> functions instead.
|
|
|
|
|
|
2017-02-25 08:17:53 +01:00
|
|
|
|
* `actual` {any}
|
|
|
|
|
* `expected` {any}
|
2018-05-02 16:13:16 +02:00
|
|
|
|
* `message` {string|Error}
|
2018-04-02 03:44:32 +02:00
|
|
|
|
* `operator` {string} **Default:** `'!='`
|
2018-08-02 01:05:22 +02:00
|
|
|
|
* `stackStartFn` {Function} **Default:** `assert.fail`
|
2015-11-04 16:48:45 +01:00
|
|
|
|
|
2018-01-28 12:07:18 +01:00
|
|
|
|
If `message` is falsy, the error message is set as the values of `actual` and
|
|
|
|
|
`expected` separated by the provided `operator`. If just the two `actual` and
|
|
|
|
|
`expected` arguments are provided, `operator` will default to `'!='`. If
|
|
|
|
|
`message` is provided as third argument it will be used as the error message and
|
|
|
|
|
the other arguments will be stored as properties on the thrown object. If
|
2018-08-02 01:05:22 +02:00
|
|
|
|
`stackStartFn` is provided, all stack frames above that function will be
|
2019-10-02 06:31:57 +02:00
|
|
|
|
removed from stacktrace (see [`Error.captureStackTrace`][]). If no arguments are
|
2018-01-28 12:07:18 +01:00
|
|
|
|
given, the default message `Failed` will be used.
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```js
|
2017-11-13 21:15:24 +01:00
|
|
|
|
const assert = require('assert').strict;
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2018-01-28 12:07:18 +01:00
|
|
|
|
assert.fail('a', 'b');
|
|
|
|
|
// AssertionError [ERR_ASSERTION]: 'a' != 'b'
|
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
assert.fail(1, 2, undefined, '>');
|
2017-07-02 18:06:35 +02:00
|
|
|
|
// AssertionError [ERR_ASSERTION]: 1 > 2
|
|
|
|
|
|
|
|
|
|
assert.fail(1, 2, 'fail');
|
|
|
|
|
// AssertionError [ERR_ASSERTION]: fail
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
assert.fail(1, 2, 'whoops', '>');
|
2017-07-02 18:06:35 +02:00
|
|
|
|
// AssertionError [ERR_ASSERTION]: whoops
|
2017-09-10 03:36:47 +02:00
|
|
|
|
|
|
|
|
|
assert.fail(1, 2, new TypeError('need array'));
|
|
|
|
|
// TypeError: need array
|
2017-07-02 18:06:35 +02:00
|
|
|
|
```
|
|
|
|
|
|
2018-01-28 12:07:18 +01:00
|
|
|
|
In the last three cases `actual`, `expected`, and `operator` have no
|
2017-07-02 18:06:35 +02:00
|
|
|
|
influence on the error message.
|
|
|
|
|
|
2018-08-02 01:05:22 +02:00
|
|
|
|
Example use of `stackStartFn` for truncating the exception's stacktrace:
|
2018-01-28 12:07:18 +01:00
|
|
|
|
|
2017-07-02 18:06:35 +02:00
|
|
|
|
```js
|
|
|
|
|
function suppressFrame() {
|
|
|
|
|
assert.fail('a', 'b', undefined, '!==', suppressFrame);
|
|
|
|
|
}
|
|
|
|
|
suppressFrame();
|
|
|
|
|
// AssertionError [ERR_ASSERTION]: 'a' !== 'b'
|
|
|
|
|
// at repl:1:1
|
|
|
|
|
// at ContextifyScript.Script.runInThisContext (vm.js:44:33)
|
|
|
|
|
// ...
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```
|
2015-11-04 16:48:45 +01:00
|
|
|
|
|
2019-12-23 21:27:50 +01:00
|
|
|
|
## `assert.ifError(value)`
|
2016-05-11 08:08:33 +02:00
|
|
|
|
<!-- YAML
|
|
|
|
|
added: v0.1.97
|
2018-01-19 10:35:39 +01:00
|
|
|
|
changes:
|
2018-03-02 18:53:46 +01:00
|
|
|
|
- version: v10.0.0
|
2018-01-19 10:35:39 +01:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/18247
|
|
|
|
|
description: Instead of throwing the original error it is now wrapped into
|
2019-06-20 17:13:31 +02:00
|
|
|
|
an [`AssertionError`][] that contains the full stack trace.
|
2018-03-02 18:53:46 +01:00
|
|
|
|
- version: v10.0.0
|
2018-01-23 14:07:18 +01:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/18247
|
2018-05-02 16:13:16 +02:00
|
|
|
|
description: Value may now only be `undefined` or `null`. Before all falsy
|
|
|
|
|
values were handled the same as `null` and did not throw.
|
2016-05-11 08:08:33 +02:00
|
|
|
|
-->
|
2019-09-06 07:42:22 +02:00
|
|
|
|
|
2017-02-25 08:17:53 +01:00
|
|
|
|
* `value` {any}
|
2015-11-04 16:48:45 +01:00
|
|
|
|
|
2018-01-23 14:07:18 +01:00
|
|
|
|
Throws `value` if `value` is not `undefined` or `null`. This is useful when
|
2018-04-26 03:06:10 +02:00
|
|
|
|
testing the `error` argument in callbacks. The stack trace contains all frames
|
|
|
|
|
from the error passed to `ifError()` including the potential new frames for
|
2018-08-26 18:02:27 +02:00
|
|
|
|
`ifError()` itself.
|
2015-11-04 16:48:45 +01:00
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```js
|
2017-11-13 21:15:24 +01:00
|
|
|
|
const assert = require('assert').strict;
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2018-01-18 17:20:18 +01:00
|
|
|
|
assert.ifError(null);
|
|
|
|
|
// OK
|
2016-11-08 21:04:57 +01:00
|
|
|
|
assert.ifError(0);
|
2018-01-23 14:07:18 +01:00
|
|
|
|
// AssertionError [ERR_ASSERTION]: ifError got unwanted exception: 0
|
2016-11-08 21:04:57 +01:00
|
|
|
|
assert.ifError('error');
|
2018-01-19 10:35:39 +01:00
|
|
|
|
// AssertionError [ERR_ASSERTION]: ifError got unwanted exception: 'error'
|
2016-11-08 21:04:57 +01:00
|
|
|
|
assert.ifError(new Error());
|
2018-01-19 10:35:39 +01:00
|
|
|
|
// AssertionError [ERR_ASSERTION]: ifError got unwanted exception: Error
|
2018-04-26 03:06:10 +02:00
|
|
|
|
|
|
|
|
|
// Create some random error frames.
|
|
|
|
|
let err;
|
|
|
|
|
(function errorFrame() {
|
|
|
|
|
err = new Error('test error');
|
|
|
|
|
})();
|
|
|
|
|
|
|
|
|
|
(function ifErrorFrame() {
|
|
|
|
|
assert.ifError(err);
|
|
|
|
|
})();
|
|
|
|
|
// AssertionError [ERR_ASSERTION]: ifError got unwanted exception: test error
|
|
|
|
|
// at ifErrorFrame
|
|
|
|
|
// at errorFrame
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2019-12-12 22:51:43 +01:00
|
|
|
|
## `assert.match(string, regexp[, message])`
|
|
|
|
|
<!-- YAML
|
2020-04-24 18:43:06 +02:00
|
|
|
|
added:
|
|
|
|
|
- v13.6.0
|
|
|
|
|
- v12.16.0
|
2019-12-12 22:51:43 +01:00
|
|
|
|
-->
|
|
|
|
|
|
|
|
|
|
* `string` {string}
|
|
|
|
|
* `regexp` {RegExp}
|
|
|
|
|
* `message` {string|Error}
|
|
|
|
|
|
|
|
|
|
> Stability: 1 - Experimental
|
|
|
|
|
|
|
|
|
|
Expects the `string` input to match the regular expression.
|
|
|
|
|
|
|
|
|
|
This feature is currently experimental and the name might change or it might be
|
|
|
|
|
completely removed again.
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const assert = require('assert').strict;
|
|
|
|
|
|
|
|
|
|
assert.match('I will fail', /pass/);
|
|
|
|
|
// AssertionError [ERR_ASSERTION]: The input did not match the regular ...
|
|
|
|
|
|
|
|
|
|
assert.match(123, /pass/);
|
|
|
|
|
// AssertionError [ERR_ASSERTION]: The "string" argument must be of type string.
|
|
|
|
|
|
|
|
|
|
assert.match('I will pass', /pass/);
|
|
|
|
|
// OK
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
If the values do not match, or if the `string` argument is of another type than
|
|
|
|
|
`string`, an [`AssertionError`][] is thrown with a `message` property set equal
|
|
|
|
|
to the value of the `message` parameter. If the `message` parameter is
|
|
|
|
|
undefined, a default error message is assigned. If the `message` parameter is an
|
|
|
|
|
instance of an [`Error`][] then it will be thrown instead of the
|
|
|
|
|
[`AssertionError`][].
|
|
|
|
|
|
2019-12-23 21:27:50 +01:00
|
|
|
|
## `assert.notDeepEqual(actual, expected[, message])`
|
2016-05-11 08:08:33 +02:00
|
|
|
|
<!-- YAML
|
|
|
|
|
added: v0.1.21
|
2017-08-26 00:18:23 +02:00
|
|
|
|
changes:
|
2020-03-10 18:16:08 +01:00
|
|
|
|
- version: v14.0.0
|
2019-12-02 13:12:52 +01:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/30766
|
|
|
|
|
description: NaN is now treated as being identical in case both sides are
|
|
|
|
|
NaN.
|
2017-09-01 18:50:47 +02:00
|
|
|
|
- version: v9.0.0
|
2017-08-26 00:18:23 +02:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/15001
|
2018-04-29 19:46:41 +02:00
|
|
|
|
description: The `Error` names and messages are now properly compared
|
2017-08-26 00:18:23 +02:00
|
|
|
|
- version: v8.0.0
|
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/12142
|
2018-04-29 19:46:41 +02:00
|
|
|
|
description: The `Set` and `Map` content is also compared
|
2017-08-26 00:18:23 +02:00
|
|
|
|
- version: v6.4.0, v4.7.1
|
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/8002
|
|
|
|
|
description: Typed array slices are handled correctly now.
|
|
|
|
|
- version: v6.1.0, v4.5.0
|
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/6432
|
|
|
|
|
description: Objects with circular references can be used as inputs now.
|
|
|
|
|
- version: v5.10.1, v4.4.3
|
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/5910
|
|
|
|
|
description: Handle non-`Uint8Array` typed arrays correctly.
|
2016-05-11 08:08:33 +02:00
|
|
|
|
-->
|
2019-09-06 07:42:22 +02:00
|
|
|
|
|
2017-02-25 08:17:53 +01:00
|
|
|
|
* `actual` {any}
|
|
|
|
|
* `expected` {any}
|
2018-05-02 16:13:16 +02:00
|
|
|
|
* `message` {string|Error}
|
2010-10-28 14:18:16 +02:00
|
|
|
|
|
2020-02-04 18:41:55 +01:00
|
|
|
|
**Strict assertion mode**
|
2017-11-13 21:15:24 +01:00
|
|
|
|
|
|
|
|
|
An alias of [`assert.notDeepStrictEqual()`][].
|
|
|
|
|
|
2020-02-04 18:41:55 +01:00
|
|
|
|
**Legacy assertion mode**
|
2017-11-13 21:15:24 +01:00
|
|
|
|
|
|
|
|
|
> Stability: 0 - Deprecated: Use [`assert.notDeepStrictEqual()`][] instead.
|
|
|
|
|
|
2016-01-30 20:12:55 +01:00
|
|
|
|
Tests for any deep inequality. Opposite of [`assert.deepEqual()`][].
|
2010-10-28 14:18:16 +02:00
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```js
|
|
|
|
|
const assert = require('assert');
|
|
|
|
|
|
|
|
|
|
const obj1 = {
|
2017-04-21 16:38:31 +02:00
|
|
|
|
a: {
|
|
|
|
|
b: 1
|
2016-01-17 18:39:07 +01:00
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
const obj2 = {
|
2017-04-21 16:38:31 +02:00
|
|
|
|
a: {
|
|
|
|
|
b: 2
|
2016-01-17 18:39:07 +01:00
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
const obj3 = {
|
2017-04-21 16:38:31 +02:00
|
|
|
|
a: {
|
|
|
|
|
b: 1
|
2016-01-17 18:39:07 +01:00
|
|
|
|
}
|
2016-07-29 05:27:45 +02:00
|
|
|
|
};
|
2016-01-17 18:39:07 +01:00
|
|
|
|
const obj4 = Object.create(obj1);
|
|
|
|
|
|
2016-01-30 16:47:14 +01:00
|
|
|
|
assert.notDeepEqual(obj1, obj1);
|
2016-11-08 21:04:57 +01:00
|
|
|
|
// AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } }
|
2016-01-17 18:39:07 +01:00
|
|
|
|
|
2016-01-30 16:47:14 +01:00
|
|
|
|
assert.notDeepEqual(obj1, obj2);
|
2018-05-02 16:13:16 +02:00
|
|
|
|
// OK
|
2016-01-17 18:39:07 +01:00
|
|
|
|
|
2016-01-30 16:47:14 +01:00
|
|
|
|
assert.notDeepEqual(obj1, obj3);
|
2016-11-08 21:04:57 +01:00
|
|
|
|
// AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } }
|
2016-01-17 18:39:07 +01:00
|
|
|
|
|
2016-01-30 16:47:14 +01:00
|
|
|
|
assert.notDeepEqual(obj1, obj4);
|
2018-05-02 16:13:16 +02:00
|
|
|
|
// OK
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2019-06-20 17:13:31 +02:00
|
|
|
|
If the values are deeply equal, an [`AssertionError`][] is thrown with a
|
|
|
|
|
`message` property set equal to the value of the `message` parameter. If the
|
|
|
|
|
`message` parameter is undefined, a default error message is assigned. If the
|
|
|
|
|
`message` parameter is an instance of an [`Error`][] then it will be thrown
|
|
|
|
|
instead of the `AssertionError`.
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2019-12-23 21:27:50 +01:00
|
|
|
|
## `assert.notDeepStrictEqual(actual, expected[, message])`
|
2016-05-11 08:08:33 +02:00
|
|
|
|
<!-- YAML
|
|
|
|
|
added: v1.2.0
|
2017-08-26 00:18:23 +02:00
|
|
|
|
changes:
|
2017-09-01 18:50:47 +02:00
|
|
|
|
- version: v9.0.0
|
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/15398
|
2018-04-29 19:46:41 +02:00
|
|
|
|
description: The `-0` and `+0` are not considered equal anymore.
|
2017-09-01 18:50:47 +02:00
|
|
|
|
- version: v9.0.0
|
2017-08-19 07:54:49 +02:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/15036
|
2018-04-29 19:46:41 +02:00
|
|
|
|
description: The `NaN` is now compared using the
|
2018-02-12 08:31:55 +01:00
|
|
|
|
[SameValueZero](https://tc39.github.io/ecma262/#sec-samevaluezero)
|
|
|
|
|
comparison.
|
2017-09-01 18:50:47 +02:00
|
|
|
|
- version: v9.0.0
|
2017-08-26 00:18:23 +02:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/15001
|
2018-04-29 19:46:41 +02:00
|
|
|
|
description: The `Error` names and messages are now properly compared
|
2017-08-26 00:18:23 +02:00
|
|
|
|
- version: v8.0.0
|
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/12142
|
2018-04-29 19:46:41 +02:00
|
|
|
|
description: The `Set` and `Map` content is also compared
|
2017-08-26 00:18:23 +02:00
|
|
|
|
- version: v6.4.0, v4.7.1
|
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/8002
|
|
|
|
|
description: Typed array slices are handled correctly now.
|
|
|
|
|
- version: v6.1.0
|
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/6432
|
|
|
|
|
description: Objects with circular references can be used as inputs now.
|
|
|
|
|
- version: v5.10.1, v4.4.3
|
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/5910
|
|
|
|
|
description: Handle non-`Uint8Array` typed arrays correctly.
|
2016-05-11 08:08:33 +02:00
|
|
|
|
-->
|
2019-09-06 07:42:22 +02:00
|
|
|
|
|
2017-02-25 08:17:53 +01:00
|
|
|
|
* `actual` {any}
|
|
|
|
|
* `expected` {any}
|
2018-05-02 16:13:16 +02:00
|
|
|
|
* `message` {string|Error}
|
2010-10-28 14:18:16 +02:00
|
|
|
|
|
2016-01-30 20:12:55 +01:00
|
|
|
|
Tests for deep strict inequality. Opposite of [`assert.deepStrictEqual()`][].
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```js
|
2017-11-13 21:15:24 +01:00
|
|
|
|
const assert = require('assert').strict;
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2017-06-01 01:07:25 +02:00
|
|
|
|
assert.notDeepStrictEqual({ a: 1 }, { a: '1' });
|
2016-11-08 21:04:57 +01:00
|
|
|
|
// OK
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2019-06-20 17:13:31 +02:00
|
|
|
|
If the values are deeply and strictly equal, an [`AssertionError`][] is thrown
|
|
|
|
|
with a `message` property set equal to the value of the `message` parameter. If
|
|
|
|
|
the `message` parameter is undefined, a default error message is assigned. If
|
|
|
|
|
the `message` parameter is an instance of an [`Error`][] then it will be thrown
|
|
|
|
|
instead of the [`AssertionError`][].
|
2015-11-04 16:48:45 +01:00
|
|
|
|
|
2019-12-23 21:27:50 +01:00
|
|
|
|
## `assert.notEqual(actual, expected[, message])`
|
2016-05-11 08:08:33 +02:00
|
|
|
|
<!-- YAML
|
|
|
|
|
added: v0.1.21
|
2019-12-02 13:12:52 +01:00
|
|
|
|
changes:
|
2020-03-10 18:16:08 +01:00
|
|
|
|
- version: v14.0.0
|
2019-12-02 13:12:52 +01:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/30766
|
|
|
|
|
description: NaN is now treated as being identical in case both sides are
|
|
|
|
|
NaN.
|
2016-05-11 08:08:33 +02:00
|
|
|
|
-->
|
2019-09-06 07:42:22 +02:00
|
|
|
|
|
2017-02-25 08:17:53 +01:00
|
|
|
|
* `actual` {any}
|
|
|
|
|
* `expected` {any}
|
2018-05-02 16:13:16 +02:00
|
|
|
|
* `message` {string|Error}
|
2015-11-04 16:48:45 +01:00
|
|
|
|
|
2020-02-04 18:41:55 +01:00
|
|
|
|
**Strict assertion mode**
|
2017-11-13 21:15:24 +01:00
|
|
|
|
|
|
|
|
|
An alias of [`assert.notStrictEqual()`][].
|
|
|
|
|
|
2020-02-04 18:41:55 +01:00
|
|
|
|
**Legacy assertion mode**
|
2017-11-13 21:15:24 +01:00
|
|
|
|
|
|
|
|
|
> Stability: 0 - Deprecated: Use [`assert.notStrictEqual()`][] instead.
|
|
|
|
|
|
2017-02-02 23:02:29 +01:00
|
|
|
|
Tests shallow, coercive inequality with the [Abstract Equality Comparison][]
|
2019-12-02 13:12:52 +01:00
|
|
|
|
(`!=` ). `NaN` is special handled and treated as being identical in case both
|
|
|
|
|
sides are `NaN`.
|
2010-10-28 14:18:16 +02:00
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```js
|
|
|
|
|
const assert = require('assert');
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
assert.notEqual(1, 2);
|
2016-11-08 21:04:57 +01:00
|
|
|
|
// OK
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
assert.notEqual(1, 1);
|
2016-11-08 21:04:57 +01:00
|
|
|
|
// AssertionError: 1 != 1
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
assert.notEqual(1, '1');
|
2016-11-08 21:04:57 +01:00
|
|
|
|
// AssertionError: 1 != '1'
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2019-06-20 17:13:31 +02:00
|
|
|
|
If the values are equal, an [`AssertionError`][] is thrown with a `message`
|
|
|
|
|
property set equal to the value of the `message` parameter. If the `message`
|
|
|
|
|
parameter is undefined, a default error message is assigned. If the `message`
|
|
|
|
|
parameter is an instance of an [`Error`][] then it will be thrown instead of the
|
2017-09-10 03:36:47 +02:00
|
|
|
|
`AssertionError`.
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2019-12-23 21:27:50 +01:00
|
|
|
|
## `assert.notStrictEqual(actual, expected[, message])`
|
2016-05-11 08:08:33 +02:00
|
|
|
|
<!-- YAML
|
|
|
|
|
added: v0.1.21
|
2017-11-13 23:34:16 +01:00
|
|
|
|
changes:
|
2018-03-02 18:53:46 +01:00
|
|
|
|
- version: v10.0.0
|
2017-11-13 23:34:16 +01:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/17003
|
|
|
|
|
description: Used comparison changed from Strict Equality to `Object.is()`
|
2016-05-11 08:08:33 +02:00
|
|
|
|
-->
|
2019-09-06 07:42:22 +02:00
|
|
|
|
|
2017-02-25 08:17:53 +01:00
|
|
|
|
* `actual` {any}
|
|
|
|
|
* `expected` {any}
|
2018-05-02 16:13:16 +02:00
|
|
|
|
* `message` {string|Error}
|
2010-10-28 14:18:16 +02:00
|
|
|
|
|
2017-11-13 19:44:30 +01:00
|
|
|
|
Tests strict inequality between the `actual` and `expected` parameters as
|
|
|
|
|
determined by the [SameValue Comparison][].
|
2015-01-28 17:48:56 +01:00
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```js
|
2017-11-13 21:15:24 +01:00
|
|
|
|
const assert = require('assert').strict;
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
assert.notStrictEqual(1, 2);
|
2016-11-08 21:04:57 +01:00
|
|
|
|
// OK
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
assert.notStrictEqual(1, 1);
|
2018-07-03 02:06:57 +02:00
|
|
|
|
// AssertionError [ERR_ASSERTION]: Expected "actual" to be strictly unequal to:
|
|
|
|
|
//
|
|
|
|
|
// 1
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
assert.notStrictEqual(1, '1');
|
2016-11-08 21:04:57 +01:00
|
|
|
|
// OK
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2019-06-20 17:13:31 +02:00
|
|
|
|
If the values are strictly equal, an [`AssertionError`][] is thrown with a
|
|
|
|
|
`message` property set equal to the value of the `message` parameter. If the
|
|
|
|
|
`message` parameter is undefined, a default error message is assigned. If the
|
|
|
|
|
`message` parameter is an instance of an [`Error`][] then it will be thrown
|
|
|
|
|
instead of the `AssertionError`.
|
2015-12-20 04:08:13 +01:00
|
|
|
|
|
2019-12-23 21:27:50 +01:00
|
|
|
|
## `assert.ok(value[, message])`
|
2016-05-11 08:08:33 +02:00
|
|
|
|
<!-- YAML
|
|
|
|
|
added: v0.1.21
|
2018-01-15 23:37:09 +01:00
|
|
|
|
changes:
|
2018-03-02 18:53:46 +01:00
|
|
|
|
- version: v10.0.0
|
2018-02-04 16:30:04 +01:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/18319
|
2018-04-29 19:46:41 +02:00
|
|
|
|
description: The `assert.ok()` (no arguments) will now use a predefined
|
|
|
|
|
error message.
|
2016-05-11 08:08:33 +02:00
|
|
|
|
-->
|
2019-09-06 07:42:22 +02:00
|
|
|
|
|
2017-02-25 08:17:53 +01:00
|
|
|
|
* `value` {any}
|
2018-05-02 16:13:16 +02:00
|
|
|
|
* `message` {string|Error}
|
2016-01-26 04:56:21 +01:00
|
|
|
|
|
|
|
|
|
Tests if `value` is truthy. It is equivalent to
|
|
|
|
|
`assert.equal(!!value, true, message)`.
|
|
|
|
|
|
2019-06-20 17:13:31 +02:00
|
|
|
|
If `value` is not truthy, an [`AssertionError`][] is thrown with a `message`
|
2016-01-26 04:56:21 +01:00
|
|
|
|
property set equal to the value of the `message` parameter. If the `message`
|
2017-09-10 03:36:47 +02:00
|
|
|
|
parameter is `undefined`, a default error message is assigned. If the `message`
|
2017-11-13 19:44:30 +01:00
|
|
|
|
parameter is an instance of an [`Error`][] then it will be thrown instead of the
|
2017-09-10 03:36:47 +02:00
|
|
|
|
`AssertionError`.
|
2018-01-23 14:38:34 +01:00
|
|
|
|
If no arguments are passed in at all `message` will be set to the string:
|
2018-04-29 19:46:41 +02:00
|
|
|
|
``'No value argument passed to `assert.ok()`'``.
|
2016-01-26 04:56:21 +01:00
|
|
|
|
|
2017-12-09 23:20:07 +01:00
|
|
|
|
Be aware that in the `repl` the error message will be different to the one
|
|
|
|
|
thrown in a file! See below for further details.
|
|
|
|
|
|
2016-01-26 04:56:21 +01:00
|
|
|
|
```js
|
2017-11-13 21:15:24 +01:00
|
|
|
|
const assert = require('assert').strict;
|
2016-01-26 04:56:21 +01:00
|
|
|
|
|
2016-11-08 21:04:57 +01:00
|
|
|
|
assert.ok(true);
|
|
|
|
|
// OK
|
|
|
|
|
assert.ok(1);
|
|
|
|
|
// OK
|
2017-12-09 23:20:07 +01:00
|
|
|
|
|
2018-01-23 14:38:34 +01:00
|
|
|
|
assert.ok();
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// AssertionError: No value argument passed to `assert.ok()`
|
2018-01-23 14:38:34 +01:00
|
|
|
|
|
2016-01-26 04:56:21 +01:00
|
|
|
|
assert.ok(false, 'it\'s false');
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// AssertionError: it's false
|
2017-12-09 23:20:07 +01:00
|
|
|
|
|
|
|
|
|
// In the repl:
|
|
|
|
|
assert.ok(typeof 123 === 'string');
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// AssertionError: false == true
|
2017-12-09 23:20:07 +01:00
|
|
|
|
|
|
|
|
|
// In a file (e.g. test.js):
|
|
|
|
|
assert.ok(typeof 123 === 'string');
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// AssertionError: The expression evaluated to a falsy value:
|
2017-12-09 23:20:07 +01:00
|
|
|
|
//
|
|
|
|
|
// assert.ok(typeof 123 === 'string')
|
|
|
|
|
|
|
|
|
|
assert.ok(false);
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// AssertionError: The expression evaluated to a falsy value:
|
2017-12-09 23:20:07 +01:00
|
|
|
|
//
|
|
|
|
|
// assert.ok(false)
|
|
|
|
|
|
|
|
|
|
assert.ok(0);
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// AssertionError: The expression evaluated to a falsy value:
|
2017-12-09 23:20:07 +01:00
|
|
|
|
//
|
|
|
|
|
// assert.ok(0)
|
|
|
|
|
|
|
|
|
|
// Using `assert()` works the same:
|
|
|
|
|
assert(0);
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// AssertionError: The expression evaluated to a falsy value:
|
2017-12-09 23:20:07 +01:00
|
|
|
|
//
|
|
|
|
|
// assert(0)
|
2016-01-26 04:56:21 +01:00
|
|
|
|
```
|
|
|
|
|
|
2019-12-23 21:27:50 +01:00
|
|
|
|
## `assert.rejects(asyncFn[, error][, message])`
|
2018-01-12 00:16:41 +01:00
|
|
|
|
<!-- YAML
|
2018-03-02 18:53:46 +01:00
|
|
|
|
added: v10.0.0
|
2018-01-12 00:16:41 +01:00
|
|
|
|
-->
|
2019-09-06 07:42:22 +02:00
|
|
|
|
|
2018-09-04 01:10:29 +02:00
|
|
|
|
* `asyncFn` {Function|Promise}
|
2018-04-09 01:31:59 +02:00
|
|
|
|
* `error` {RegExp|Function|Object|Error}
|
2018-09-04 01:10:29 +02:00
|
|
|
|
* `message` {string}
|
2018-01-12 00:16:41 +01:00
|
|
|
|
|
2018-09-04 01:10:29 +02:00
|
|
|
|
Awaits the `asyncFn` promise or, if `asyncFn` is a function, immediately
|
|
|
|
|
calls the function and awaits the returned promise to complete. It will then
|
|
|
|
|
check that the promise is rejected.
|
2018-01-12 00:16:41 +01:00
|
|
|
|
|
2018-09-04 01:10:29 +02:00
|
|
|
|
If `asyncFn` is a function and it throws an error synchronously,
|
2018-04-29 19:46:41 +02:00
|
|
|
|
`assert.rejects()` will return a rejected `Promise` with that error. If the
|
2018-04-09 00:38:41 +02:00
|
|
|
|
function does not return a promise, `assert.rejects()` will return a rejected
|
2018-04-29 19:46:41 +02:00
|
|
|
|
`Promise` with an [`ERR_INVALID_RETURN_VALUE`][] error. In both cases the error
|
2018-04-09 00:38:41 +02:00
|
|
|
|
handler is skipped.
|
2018-01-12 00:16:41 +01:00
|
|
|
|
|
2018-03-11 13:05:04 +01:00
|
|
|
|
Besides the async nature to await the completion behaves identically to
|
2018-01-12 00:16:41 +01:00
|
|
|
|
[`assert.throws()`][].
|
|
|
|
|
|
2018-04-09 01:31:59 +02:00
|
|
|
|
If specified, `error` can be a [`Class`][], [`RegExp`][], a validation function,
|
|
|
|
|
an object where each property will be tested for, or an instance of error where
|
|
|
|
|
each property will be tested for including the non-enumerable `message` and
|
|
|
|
|
`name` properties.
|
2018-01-12 00:16:41 +01:00
|
|
|
|
|
2019-06-20 17:13:31 +02:00
|
|
|
|
If specified, `message` will be the message provided by the [`AssertionError`][]
|
|
|
|
|
if the `asyncFn` fails to reject.
|
2018-01-12 00:16:41 +01:00
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
(async () => {
|
|
|
|
|
await assert.rejects(
|
|
|
|
|
async () => {
|
2018-04-08 23:28:30 +02:00
|
|
|
|
throw new TypeError('Wrong value');
|
2018-01-12 00:16:41 +01:00
|
|
|
|
},
|
2018-04-08 23:28:30 +02:00
|
|
|
|
{
|
|
|
|
|
name: 'TypeError',
|
|
|
|
|
message: 'Wrong value'
|
|
|
|
|
}
|
2018-01-12 00:16:41 +01:00
|
|
|
|
);
|
|
|
|
|
})();
|
|
|
|
|
```
|
|
|
|
|
|
2020-01-09 08:14:44 +01:00
|
|
|
|
```js
|
|
|
|
|
(async () => {
|
|
|
|
|
await assert.rejects(
|
|
|
|
|
async () => {
|
|
|
|
|
throw new TypeError('Wrong value');
|
|
|
|
|
},
|
|
|
|
|
(err) => {
|
|
|
|
|
assert.strictEqual(err.name, 'TypeError');
|
|
|
|
|
assert.strictEqual(err.message, 'Wrong value');
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
})();
|
|
|
|
|
```
|
|
|
|
|
|
2018-01-12 00:16:41 +01:00
|
|
|
|
```js
|
|
|
|
|
assert.rejects(
|
2018-04-08 23:28:30 +02:00
|
|
|
|
Promise.reject(new Error('Wrong value')),
|
2018-01-12 00:16:41 +01:00
|
|
|
|
Error
|
|
|
|
|
).then(() => {
|
|
|
|
|
// ...
|
|
|
|
|
});
|
|
|
|
|
```
|
|
|
|
|
|
2019-06-20 22:10:15 +02:00
|
|
|
|
`error` cannot be a string. If a string is provided as the second
|
2018-04-08 23:28:30 +02:00
|
|
|
|
argument, then `error` is assumed to be omitted and the string will be used for
|
|
|
|
|
`message` instead. This can lead to easy-to-miss mistakes. Please read the
|
|
|
|
|
example in [`assert.throws()`][] carefully if using a string as the second
|
|
|
|
|
argument gets considered.
|
|
|
|
|
|
2019-12-23 21:27:50 +01:00
|
|
|
|
## `assert.strictEqual(actual, expected[, message])`
|
2018-03-11 13:05:04 +01:00
|
|
|
|
<!-- YAML
|
|
|
|
|
added: v0.1.21
|
|
|
|
|
changes:
|
2018-03-02 18:53:46 +01:00
|
|
|
|
- version: v10.0.0
|
2018-03-11 13:05:04 +01:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/17003
|
|
|
|
|
description: Used comparison changed from Strict Equality to `Object.is()`
|
|
|
|
|
-->
|
2019-09-06 07:42:22 +02:00
|
|
|
|
|
2018-03-11 13:05:04 +01:00
|
|
|
|
* `actual` {any}
|
|
|
|
|
* `expected` {any}
|
2018-05-02 16:13:16 +02:00
|
|
|
|
* `message` {string|Error}
|
2018-03-11 13:05:04 +01:00
|
|
|
|
|
|
|
|
|
Tests strict equality between the `actual` and `expected` parameters as
|
|
|
|
|
determined by the [SameValue Comparison][].
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const assert = require('assert').strict;
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(1, 2);
|
2018-07-03 02:06:57 +02:00
|
|
|
|
// AssertionError [ERR_ASSERTION]: Expected inputs to be strictly equal:
|
|
|
|
|
//
|
|
|
|
|
// 1 !== 2
|
2018-03-11 13:05:04 +01:00
|
|
|
|
|
|
|
|
|
assert.strictEqual(1, 1);
|
|
|
|
|
// OK
|
|
|
|
|
|
2018-07-03 02:06:57 +02:00
|
|
|
|
assert.strictEqual('Hello foobar', 'Hello World!');
|
|
|
|
|
// AssertionError [ERR_ASSERTION]: Expected inputs to be strictly equal:
|
|
|
|
|
// + actual - expected
|
|
|
|
|
//
|
|
|
|
|
// + 'Hello foobar'
|
|
|
|
|
// - 'Hello World!'
|
|
|
|
|
// ^
|
2019-06-06 09:12:14 +02:00
|
|
|
|
|
|
|
|
|
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('Inputs are not identical'));
|
|
|
|
|
// TypeError: Inputs are not identical
|
2018-03-11 13:05:04 +01:00
|
|
|
|
```
|
|
|
|
|
|
2019-06-20 17:13:31 +02:00
|
|
|
|
If the values are not strictly equal, an [`AssertionError`][] is thrown with a
|
2018-03-11 13:05:04 +01:00
|
|
|
|
`message` property set equal to the value of the `message` parameter. If the
|
|
|
|
|
`message` parameter is undefined, a default error message is assigned. If the
|
|
|
|
|
`message` parameter is an instance of an [`Error`][] then it will be thrown
|
2019-06-20 17:13:31 +02:00
|
|
|
|
instead of the [`AssertionError`][].
|
2018-03-11 13:05:04 +01:00
|
|
|
|
|
2019-12-23 21:27:50 +01:00
|
|
|
|
## `assert.throws(fn[, error][, message])`
|
2016-05-11 08:08:33 +02:00
|
|
|
|
<!-- YAML
|
|
|
|
|
added: v0.1.21
|
2017-02-21 23:39:15 +01:00
|
|
|
|
changes:
|
2018-05-14 20:01:36 +02:00
|
|
|
|
- version: v10.2.0
|
2018-05-14 19:35:45 +02:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/20485
|
|
|
|
|
description: The `error` parameter can be an object containing regular
|
|
|
|
|
expressions now.
|
2018-03-18 14:45:41 +01:00
|
|
|
|
- version: v9.9.0
|
2018-02-04 16:30:04 +01:00
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/17584
|
2017-12-10 01:54:44 +01:00
|
|
|
|
description: The `error` parameter can now be an object as well.
|
2017-02-21 23:39:15 +01:00
|
|
|
|
- version: v4.2.0
|
|
|
|
|
pr-url: https://github.com/nodejs/node/pull/3276
|
|
|
|
|
description: The `error` parameter can now be an arrow function.
|
2016-05-11 08:08:33 +02:00
|
|
|
|
-->
|
2019-09-06 07:42:22 +02:00
|
|
|
|
|
2018-09-04 01:10:29 +02:00
|
|
|
|
* `fn` {Function}
|
2018-04-09 01:31:59 +02:00
|
|
|
|
* `error` {RegExp|Function|Object|Error}
|
2018-09-04 01:10:29 +02:00
|
|
|
|
* `message` {string}
|
2010-10-28 14:18:16 +02:00
|
|
|
|
|
2018-09-04 01:10:29 +02:00
|
|
|
|
Expects the function `fn` to throw an error.
|
2016-04-03 21:11:10 +02:00
|
|
|
|
|
2018-04-09 01:31:59 +02:00
|
|
|
|
If specified, `error` can be a [`Class`][], [`RegExp`][], a validation function,
|
2018-05-02 19:26:32 +02:00
|
|
|
|
a validation object where each property will be tested for strict deep equality,
|
|
|
|
|
or an instance of error where each property will be tested for strict deep
|
|
|
|
|
equality including the non-enumerable `message` and `name` properties. When
|
|
|
|
|
using an object, it is also possible to use a regular expression, when
|
|
|
|
|
validating against a string property. See below for examples.
|
2016-04-03 21:11:10 +02:00
|
|
|
|
|
2018-09-04 01:10:29 +02:00
|
|
|
|
If specified, `message` will be appended to the message provided by the
|
|
|
|
|
`AssertionError` if the `fn` call fails to throw or in case the error validation
|
|
|
|
|
fails.
|
2010-12-02 20:07:47 +01:00
|
|
|
|
|
2018-06-04 21:32:54 +02:00
|
|
|
|
Custom validation object/error instance:
|
2018-04-26 03:06:10 +02:00
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const err = new TypeError('Wrong value');
|
|
|
|
|
err.code = 404;
|
2018-05-02 19:26:32 +02:00
|
|
|
|
err.foo = 'bar';
|
|
|
|
|
err.info = {
|
|
|
|
|
nested: true,
|
|
|
|
|
baz: 'text'
|
|
|
|
|
};
|
|
|
|
|
err.reg = /abc/i;
|
2018-04-26 03:06:10 +02:00
|
|
|
|
|
|
|
|
|
assert.throws(
|
|
|
|
|
() => {
|
|
|
|
|
throw err;
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: 'TypeError',
|
2018-05-02 19:26:32 +02:00
|
|
|
|
message: 'Wrong value',
|
|
|
|
|
info: {
|
|
|
|
|
nested: true,
|
|
|
|
|
baz: 'text'
|
|
|
|
|
}
|
2019-06-20 22:10:15 +02:00
|
|
|
|
// Only properties on the validation object will be tested for.
|
2018-05-02 19:26:32 +02:00
|
|
|
|
// 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
|
2018-04-26 03:06:10 +02:00
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// Fails due to the different `message` and `name` properties:
|
|
|
|
|
assert.throws(
|
|
|
|
|
() => {
|
|
|
|
|
const otherErr = new Error('Not found');
|
2019-06-17 16:35:10 +02:00
|
|
|
|
// Copy all enumerable properties from `err` to `otherErr`.
|
|
|
|
|
for (const [key, value] of Object.entries(err)) {
|
|
|
|
|
otherErr[key] = value;
|
|
|
|
|
}
|
2018-04-26 03:06:10 +02:00
|
|
|
|
throw otherErr;
|
|
|
|
|
},
|
2019-06-17 16:35:10 +02:00
|
|
|
|
// The error's `message` and `name` properties will also be checked when using
|
|
|
|
|
// an error as validation object.
|
|
|
|
|
err
|
2018-04-26 03:06:10 +02:00
|
|
|
|
);
|
|
|
|
|
```
|
|
|
|
|
|
2010-12-02 20:07:47 +01:00
|
|
|
|
Validate instanceof using constructor:
|
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```js
|
|
|
|
|
assert.throws(
|
2016-01-24 10:15:51 +01:00
|
|
|
|
() => {
|
2016-01-17 18:39:07 +01:00
|
|
|
|
throw new Error('Wrong value');
|
|
|
|
|
},
|
|
|
|
|
Error
|
|
|
|
|
);
|
|
|
|
|
```
|
2010-12-02 20:07:47 +01:00
|
|
|
|
|
2015-11-28 00:30:32 +01:00
|
|
|
|
Validate error message using [`RegExp`][]:
|
2010-12-02 20:07:47 +01:00
|
|
|
|
|
2017-12-11 08:04:17 +01:00
|
|
|
|
Using a regular expression runs `.toString` on the error object, and will
|
|
|
|
|
therefore also include the error name.
|
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```js
|
|
|
|
|
assert.throws(
|
2016-01-24 10:15:51 +01:00
|
|
|
|
() => {
|
2016-01-17 18:39:07 +01:00
|
|
|
|
throw new Error('Wrong value');
|
|
|
|
|
},
|
2017-12-11 08:04:17 +01:00
|
|
|
|
/^Error: Wrong value$/
|
2016-01-17 18:39:07 +01:00
|
|
|
|
);
|
|
|
|
|
```
|
2010-12-02 20:07:47 +01:00
|
|
|
|
|
|
|
|
|
Custom error validation:
|
|
|
|
|
|
2019-06-14 16:14:50 +02:00
|
|
|
|
The function must return `true` to indicate all internal validations passed.
|
2019-06-20 17:13:31 +02:00
|
|
|
|
It will otherwise fail with an [`AssertionError`][].
|
2019-06-14 16:14:50 +02:00
|
|
|
|
|
2016-01-17 18:39:07 +01:00
|
|
|
|
```js
|
|
|
|
|
assert.throws(
|
2016-01-24 10:15:51 +01:00
|
|
|
|
() => {
|
2016-01-17 18:39:07 +01:00
|
|
|
|
throw new Error('Wrong value');
|
|
|
|
|
},
|
2019-05-20 00:30:45 +02:00
|
|
|
|
(err) => {
|
|
|
|
|
assert(err instanceof Error);
|
|
|
|
|
assert(/value/.test(err));
|
2019-11-20 15:53:45 +01:00
|
|
|
|
// 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.
|
2019-05-20 00:30:45 +02:00
|
|
|
|
return true;
|
2016-01-17 18:39:07 +01:00
|
|
|
|
},
|
|
|
|
|
'unexpected error'
|
|
|
|
|
);
|
|
|
|
|
```
|
2015-11-14 04:21:49 +01:00
|
|
|
|
|
2019-06-20 22:10:15 +02:00
|
|
|
|
`error` cannot be a string. If a string is provided as the second
|
2016-04-03 21:11:10 +02:00
|
|
|
|
argument, then `error` is assumed to be omitted and the string will be used for
|
2018-04-26 03:06:10 +02:00
|
|
|
|
`message` instead. This can lead to easy-to-miss mistakes. Using the same
|
|
|
|
|
message as the thrown error message is going to result in an
|
|
|
|
|
`ERR_AMBIGUOUS_ARGUMENT` error. Please read the example below carefully if using
|
|
|
|
|
a string as the second argument gets considered:
|
2016-04-03 21:11:10 +02:00
|
|
|
|
|
2017-07-30 22:46:34 +02:00
|
|
|
|
<!-- eslint-disable no-restricted-syntax -->
|
2016-04-03 21:11:10 +02:00
|
|
|
|
```js
|
2017-12-10 00:47:49 +01:00
|
|
|
|
function throwingFirst() {
|
|
|
|
|
throw new Error('First');
|
|
|
|
|
}
|
2019-11-28 07:56:21 +01:00
|
|
|
|
|
2017-12-10 00:47:49 +01:00
|
|
|
|
function throwingSecond() {
|
|
|
|
|
throw new Error('Second');
|
|
|
|
|
}
|
2019-11-28 07:56:21 +01:00
|
|
|
|
|
2017-12-10 00:47:49 +01:00
|
|
|
|
function notThrowing() {}
|
|
|
|
|
|
|
|
|
|
// The second argument is a string and the input function threw an Error.
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// The first case will not throw as it does not match for the error message
|
|
|
|
|
// thrown by the input function!
|
2017-12-10 00:47:49 +01:00
|
|
|
|
assert.throws(throwingFirst, 'Second');
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// 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
|
2018-07-03 02:06:57 +02:00
|
|
|
|
// against the error message, Node.js throws an `ERR_AMBIGUOUS_ARGUMENT` error.
|
2017-12-10 00:47:49 +01:00
|
|
|
|
assert.throws(throwingSecond, 'Second');
|
2018-04-26 03:06:10 +02:00
|
|
|
|
// TypeError [ERR_AMBIGUOUS_ARGUMENT]
|
2017-12-10 00:47:49 +01:00
|
|
|
|
|
|
|
|
|
// 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:
|
2018-07-03 02:06:57 +02:00
|
|
|
|
// It does not throw because the error messages match.
|
2017-12-10 00:47:49 +01:00
|
|
|
|
assert.throws(throwingSecond, /Second$/);
|
2018-07-03 02:06:57 +02:00
|
|
|
|
|
2019-06-17 16:35:10 +02:00
|
|
|
|
// If the error message does not match, an AssertionError is thrown.
|
2017-12-10 00:47:49 +01:00
|
|
|
|
assert.throws(throwingFirst, /Second$/);
|
2019-06-17 16:35:10 +02:00
|
|
|
|
// AssertionError [ERR_ASSERTION]
|
2016-04-03 21:11:10 +02:00
|
|
|
|
```
|
|
|
|
|
|
2019-11-20 15:53:45 +01:00
|
|
|
|
Due to the confusing error-prone notation, avoid a string as the second
|
|
|
|
|
argument.
|
2017-12-10 00:47:49 +01:00
|
|
|
|
|
2019-06-20 17:13:31 +02:00
|
|
|
|
[`AssertionError`]: #assert_class_assert_assertionerror
|
2018-04-09 01:31:59 +02:00
|
|
|
|
[`Class`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
|
2018-11-27 20:49:21 +01:00
|
|
|
|
[`ERR_INVALID_RETURN_VALUE`]: errors.html#errors_err_invalid_return_value
|
2017-07-02 18:06:35 +02:00
|
|
|
|
[`Error.captureStackTrace`]: errors.html#errors_error_capturestacktrace_targetobject_constructoropt
|
2018-01-18 02:58:22 +01:00
|
|
|
|
[`Error`]: errors.html#errors_class_error
|
2018-02-07 22:55:37 +01:00
|
|
|
|
[`Map`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
|
2017-05-08 18:30:13 +02:00
|
|
|
|
[`Object.is()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
|
|
|
|
|
[`RegExp`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
|
2018-02-07 22:55:37 +01:00
|
|
|
|
[`Set`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
|
|
|
|
|
[`Symbol`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol
|
2017-05-08 18:30:13 +02:00
|
|
|
|
[`TypeError`]: errors.html#errors_class_typeerror
|
2018-02-07 22:55:37 +01:00
|
|
|
|
[`WeakMap`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap
|
|
|
|
|
[`WeakSet`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet
|
2020-02-27 12:41:05 +01:00
|
|
|
|
[`CallTracker`]: #assert_class_assert_calltracker
|
2016-01-30 20:12:55 +01:00
|
|
|
|
[`assert.deepEqual()`]: #assert_assert_deepequal_actual_expected_message
|
|
|
|
|
[`assert.deepStrictEqual()`]: #assert_assert_deepstrictequal_actual_expected_message
|
2018-09-04 01:10:29 +02:00
|
|
|
|
[`assert.doesNotThrow()`]: #assert_assert_doesnotthrow_fn_error_message
|
2019-09-14 20:42:53 +02:00
|
|
|
|
[`assert.equal()`]: #assert_assert_equal_actual_expected_message
|
|
|
|
|
[`assert.notDeepEqual()`]: #assert_assert_notdeepequal_actual_expected_message
|
2017-11-13 21:15:24 +01:00
|
|
|
|
[`assert.notDeepStrictEqual()`]: #assert_assert_notdeepstrictequal_actual_expected_message
|
2019-09-14 20:42:53 +02:00
|
|
|
|
[`assert.notEqual()`]: #assert_assert_notequal_actual_expected_message
|
2017-11-13 21:15:24 +01:00
|
|
|
|
[`assert.notStrictEqual()`]: #assert_assert_notstrictequal_actual_expected_message
|
2016-01-26 04:56:21 +01:00
|
|
|
|
[`assert.ok()`]: #assert_assert_ok_value_message
|
2017-11-13 21:15:24 +01:00
|
|
|
|
[`assert.strictEqual()`]: #assert_assert_strictequal_actual_expected_message
|
2018-09-04 01:10:29 +02:00
|
|
|
|
[`assert.throws()`]: #assert_assert_throws_fn_error_message
|
2020-02-27 12:41:05 +01:00
|
|
|
|
[`process.on('exit')`]: process.html#process_event_exit
|
|
|
|
|
[`tracker.calls()`]: #assert_class_assert_CallTracker#tracker_calls
|
|
|
|
|
[`tracker.verify()`]: #assert_class_assert_CallTracker#tracker_verify
|
2020-02-04 18:41:55 +01:00
|
|
|
|
[strict assertion mode]: #assert_strict_assertion_mode
|
2017-02-02 23:02:29 +01:00
|
|
|
|
[Abstract Equality Comparison]: https://tc39.github.io/ecma262/#sec-abstract-equality-comparison
|
2018-11-27 20:49:21 +01:00
|
|
|
|
[Object wrappers]: https://developer.mozilla.org/en-US/docs/Glossary/Primitive#Primitive_wrapper_objects_in_JavaScript
|
2017-05-08 18:30:13 +02:00
|
|
|
|
[Object.prototype.toString()]: https://tc39.github.io/ecma262/#sec-object.prototype.tostring
|
2017-11-13 19:44:30 +01:00
|
|
|
|
[SameValue Comparison]: https://tc39.github.io/ecma262/#sec-samevalue
|
2017-05-08 18:30:13 +02:00
|
|
|
|
[Strict Equality Comparison]: https://tc39.github.io/ecma262/#sec-strict-equality-comparison
|
2017-01-31 20:51:54 +01:00
|
|
|
|
[enumerable "own" properties]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties
|
2017-05-08 18:30:13 +02:00
|
|
|
|
[prototype-spec]: https://tc39.github.io/ecma262/#sec-ordinary-object-internal-methods-and-internal-slots
|