From d2b6f4dbab3742f51b8061812191b6fce61d2fe0 Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Tue, 6 Feb 2018 11:08:23 +0100 Subject: [PATCH 1/2] 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. --- 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 75d2473c486261..0c6e35b001b08c 100644 --- a/lib/assert.js +++ b/lib/assert.js @@ -344,11 +344,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 compareKey(actual, expected, key, msg) { + if (!isDeepStrictEqual(actual[key], expected[key])) { + 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) { @@ -363,23 +369,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)); + compareKey(actual, expected, 'name', msg); } if ('message' in expected) { - assert.strictEqual( - actual.message, - expected.message, - createMsg(msg, 'message', actual, expected)); + compareKey(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)) { + compareKey(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..d34bdd24798190 --- /dev/null +++ b/test/message/assert_throws_stack.out @@ -0,0 +1,14 @@ +assert.js:* + throw new AssertionError(obj); + ^ + +AssertionError [ERR_ASSERTION]: bar: expected true, not undefined + at Object. (*assert_throws_stack.js:*:*) + at * + at * + at * + at * + at * + at * + at * + at * From 61e29c60979f6cfa6c67ad87a5312a09851427d4 Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Tue, 6 Feb 2018 20:19:10 +0100 Subject: [PATCH 2/2] fixup: change name --- lib/assert.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/assert.js b/lib/assert.js index 0c6e35b001b08c..4c45d682c8dd2d 100644 --- a/lib/assert.js +++ b/lib/assert.js @@ -344,7 +344,7 @@ assert.notStrictEqual = function notStrictEqual(actual, expected, message) { } }; -function compareKey(actual, expected, key, msg) { +function compareExceptionKey(actual, expected, key, msg) { if (!isDeepStrictEqual(actual[key], expected[key])) { innerFail({ actual: actual[key], @@ -369,13 +369,13 @@ function expectedException(actual, expected, msg) { // The name and message could be non enumerable. Therefore test them // explicitly. if ('name' in expected) { - compareKey(actual, expected, 'name', msg); + compareExceptionKey(actual, expected, 'name', msg); } if ('message' in expected) { - compareKey(actual, expected, 'message', msg); + compareExceptionKey(actual, expected, 'message', msg); } for (const key of Object.keys(expected)) { - compareKey(actual, expected, key, msg); + compareExceptionKey(actual, expected, key, msg); } return true; }