From 18071db274cffc4364440ef8dfc6cc2e5bfba1bf Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Tue, 6 Feb 2018 11:08:23 +0100 Subject: [PATCH] assert: fix throws trace The current stack trace thrown in case `assert.throws(fn, object)` is used did not filter the stack trace. This fixes it. Backport-PR-URL: https://github.com/nodejs/node/pull/23223 PR-URL: https://github.com/nodejs/node/pull/18595 Reviewed-By: James M Snell Reviewed-By: Anatoli Papirovski --- lib/assert.js | 34 ++++++++++++---------------- test/message/assert_throws_stack.js | 6 +++++ test/message/assert_throws_stack.out | 14 ++++++++++++ 3 files changed, 35 insertions(+), 19 deletions(-) create mode 100644 test/message/assert_throws_stack.js create mode 100644 test/message/assert_throws_stack.out diff --git a/lib/assert.js b/lib/assert.js index 75fe173094aedb..ad568547b45c6a 100644 --- a/lib/assert.js +++ b/lib/assert.js @@ -661,11 +661,17 @@ assert.notStrictEqual = function notStrictEqual(actual, expected, message) { } }; -function createMsg(msg, key, actual, expected) { - if (msg) - return msg; - return `${key}: expected ${inspect(expected[key])}, ` + - `not ${inspect(actual[key])}`; +function compareExceptionKey(actual, expected, key, msg) { + if (!innerDeepEqual(actual[key], expected[key], true)) { + innerFail({ + actual: actual[key], + expected: expected[key], + message: msg || `${key}: expected ${inspect(expected[key])}, ` + + `not ${inspect(actual[key])}`, + operator: 'throws', + stackStartFn: assert.throws + }); + } } function expectedException(actual, expected, msg) { @@ -680,23 +686,13 @@ function expectedException(actual, expected, msg) { // The name and message could be non enumerable. Therefore test them // explicitly. if ('name' in expected) { - assert.strictEqual( - actual.name, - expected.name, - createMsg(msg, 'name', actual, expected)); + compareExceptionKey(actual, expected, 'name', msg); } if ('message' in expected) { - assert.strictEqual( - actual.message, - expected.message, - createMsg(msg, 'message', actual, expected)); + compareExceptionKey(actual, expected, 'message', msg); } - const keys = Object.keys(expected); - for (const key of keys) { - assert.deepStrictEqual( - actual[key], - expected[key], - createMsg(msg, key, actual, expected)); + for (const key of Object.keys(expected)) { + compareExceptionKey(actual, expected, key, msg); } return true; } diff --git a/test/message/assert_throws_stack.js b/test/message/assert_throws_stack.js new file mode 100644 index 00000000000000..36bc5734cae37f --- /dev/null +++ b/test/message/assert_throws_stack.js @@ -0,0 +1,6 @@ +'use strict'; + +require('../common'); +const assert = require('assert').strict; + +assert.throws(() => { throw new Error('foo'); }, { bar: true }); diff --git a/test/message/assert_throws_stack.out b/test/message/assert_throws_stack.out new file mode 100644 index 00000000000000..04e62b98139eed --- /dev/null +++ b/test/message/assert_throws_stack.out @@ -0,0 +1,14 @@ +assert.js:* + throw new errors.AssertionError(obj); + ^ + +AssertionError [ERR_ASSERTION]: bar: expected true, not undefined + at Object. (*assert_throws_stack.js:*:*) + at * + at * + at * + at * + at * + at * + at * + at *