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.

PR-URL: https://github.com/nodejs/node/pull/18595
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Anatoli Papirovski <apapirovski@mac.com>
This commit is contained in:
Ruben Bridgewater 2018-02-06 11:08:23 +01:00 committed by Anatoli Papirovski
parent 14bc3e22f3
commit cccddc59e5
No known key found for this signature in database
GPG Key ID: 614E2E1ABEB4B2C0
3 changed files with 35 additions and 19 deletions

View File

@ -361,11 +361,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 (!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) {
@ -380,23 +386,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;
}

View File

@ -0,0 +1,6 @@
'use strict';
require('../common');
const assert = require('assert').strict;
assert.throws(() => { throw new Error('foo'); }, { bar: true });

View File

@ -0,0 +1,14 @@
assert.js:*
throw new AssertionError(obj);
^
AssertionError [ERR_ASSERTION]: bar: expected true, not undefined
at Object.<anonymous> (*assert_throws_stack.js:*:*)
at *
at *
at *
at *
at *
at *
at *
at *