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

2 files changed

Lines changed: 22 additions & 3 deletions

File tree

‎lib/assert.js‎

Lines changed: 7 additions & 3 deletions
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-
constname=actual.constructor&&actual.constructor.name;
626-
message+=`"${name||actual.name}"`;
624+
constname=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‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
constcommon=require('../common');
2626
constassert=require('assert');
2727
const{ inspect }=require('util');
28+
constvm=require('vm');
2829
const{ internalBinding }=require('internal/test/binding');
2930
consta=assert;
3031

@@ -1344,3 +1345,17 @@ assert.throws(
13441345
}
13451346
);
13461347
}
1348+
1349+
assert.throws(
1350+
()=>{
1351+
constscript=newvm.Script('new RangeError("foobar");');
1352+
constcontext=vm.createContext();
1353+
consterr=script.runInContext(context);
1354+
assert.throws(()=>{throwerr;},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)