Browse Source

assert: accommodate ES6 classes that extend Error

`assert.throws()` and `assert.doesNotThrow()` blow up with a `TypeError`
if used with an ES6 class that extends Error.

Fixes: https://github.com/nodejs/node/issues/3188
PR-URL: https://github.com/nodejs/node/pull/4166
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
v5.x
Rich Trott 9 years ago
committed by cjihrig
parent
commit
91cbc014ba
  1. 4
      lib/assert.js
  2. 21
      test/parallel/test-assert.js

4
lib/assert.js

@ -278,6 +278,10 @@ function expectedException(actual, expected) {
// Ignore. The instanceof check doesn't work for arrow functions.
}
if (Error.isPrototypeOf(expected)) {
return false;
}
return expected.call({}, actual) === true;
}

21
test/parallel/test-assert.js

@ -344,9 +344,28 @@ a.throws(makeBlock(thrower, TypeError), function(err) {
}
});
// https://github.com/nodejs/node/issues/3188
threw = false;
// GH-207. Make sure deepEqual doesn't loop forever on circular refs
try {
var ES6Error = class extends Error {};
var AnotherErrorType = class extends Error {};
const functionThatThrows = function() {
throw new AnotherErrorType('foo');
};
assert.throws(functionThatThrows, ES6Error);
} catch (e) {
threw = true;
assert(e instanceof AnotherErrorType,
`expected AnotherErrorType, received ${e}`);
}
assert.ok(threw);
// GH-207. Make sure deepEqual doesn't loop forever on circular refs
var b = {};
b.b = b;

Loading…
Cancel
Save