Skip to content

Commit 48d1ea5

Browse files
committed
assert: special handle identical error names in instance checks
This makes sure that using `assert.throws()` or `assert.rejects()` in combination with Error classes log appropriate error messages in case the expected and received constructor name are identical but not part of the same prototype chain. PR-URL: #28263 Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent 97c52ca commit 48d1ea5

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

lib/assert.js

+7-3
Original file line numberDiff line numberDiff line change
@@ -620,10 +620,14 @@ function expectedException(actual, expected, message, fn) {
620620
generatedMessage = true;
621621
message = 'The error is expected to be an instance of ' +
622622
`"${expected.name}". Received `;
623-
// TODO: Special handle identical names.
624623
if (isError(actual)) {
625-
const name = actual.constructor && actual.constructor.name;
626-
message += `"${name || actual.name}"`;
624+
const name = actual.constructor && actual.constructor.name ||
625+
actual.name;
626+
if (expected.name === name) {
627+
message += 'an error with identical name but a different prototype.';
628+
} else {
629+
message += `"${name}"`;
630+
}
627631
if (actual.message) {
628632
message += `\n\nError message:\n\n${actual.message}`;
629633
}

test/parallel/test-assert.js

+15
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
const common = require('../common');
2626
const assert = require('assert');
2727
const { inspect } = require('util');
28+
const vm = require('vm');
2829
const { internalBinding } = require('internal/test/binding');
2930
const a = assert;
3031

@@ -1344,3 +1345,17 @@ assert.throws(
13441345
}
13451346
);
13461347
}
1348+
1349+
assert.throws(
1350+
() => {
1351+
const script = new vm.Script('new RangeError("foobar");');
1352+
const context = vm.createContext();
1353+
const err = script.runInContext(context);
1354+
assert.throws(() => { throw err; }, RangeError);
1355+
},
1356+
{
1357+
message: 'The error is expected to be an instance of "RangeError". ' +
1358+
'Received an error with identical name but a different ' +
1359+
'prototype.\n\nError message:\n\nfoobar'
1360+
}
1361+
);

0 commit comments

Comments
 (0)