assert: accommodate ES6 classes that extend Error
authorRich Trott <rtrott@gmail.com>
Sun, 6 Dec 2015 01:29:28 +0000 (17:29 -0800)
committerMyles Borins <mborins@us.ibm.com>
Tue, 19 Jan 2016 19:52:42 +0000 (11:52 -0800)
`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>
lib/assert.js
test/parallel/test-assert.js

index f8dc97d..3e52ab4 100644 (file)
@@ -283,6 +283,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;
 }
 
index b28ca03..e9c01fd 100644 (file)
@@ -342,9 +342,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;