From ded4f91eeff478a22e4a0eb5ba2c7ce811512c64 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Thu, 8 Oct 2015 12:25:03 +0200 Subject: [PATCH] assert: support arrow functions in .throws() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `x instanceof f` where f is an arrow function throws a (spec-conforming) "Function has non-object prototype 'undefined' in instanceof check" exception. Add a workaround so that it's possible to pass arrow functions as the second argument to assert.throws(). The try/catch block is a little jarring but swapping around the clauses in the if statements changes the semantics too much. Fixes: https://github.com/nodejs/node/issues/3275 PR-URL: https://github.com/nodejs/node/pull/3276 Reviewed-By: Michaƫl Zasso Reviewed-By: Sakthipriyan Vairamani --- lib/assert.js | 14 +++++++++----- test/parallel/test-assert.js | 4 ++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/assert.js b/lib/assert.js index ea142ed01f8f6e..6b99098c5fda35 100644 --- a/lib/assert.js +++ b/lib/assert.js @@ -268,13 +268,17 @@ function expectedException(actual, expected) { if (Object.prototype.toString.call(expected) == '[object RegExp]') { return expected.test(actual); - } else if (actual instanceof expected) { - return true; - } else if (expected.call({}, actual) === true) { - return true; } - return false; + try { + if (actual instanceof expected) { + return true; + } + } catch (e) { + // Ignore. The instanceof check doesn't work for arrow functions. + } + + return expected.call({}, actual) === true; } function _throws(shouldThrow, block, expected, message) { diff --git a/test/parallel/test-assert.js b/test/parallel/test-assert.js index ce84eabc34e1d4..ce19462a62387c 100644 --- a/test/parallel/test-assert.js +++ b/test/parallel/test-assert.js @@ -465,4 +465,8 @@ testBlockTypeError(assert.doesNotThrow, null); testBlockTypeError(assert.throws, undefined); testBlockTypeError(assert.doesNotThrow, undefined); +// https://github.com/nodejs/node/issues/3275 +assert.throws(() => { throw 'error'; }, err => err === 'error'); +assert.throws(() => { throw Error(); }, err => err instanceof Error); + console.log('All OK');