Skip to content

Commit 75463a9

Browse files
committed
assert: fix rejects stack trace and operator
This makes sure the stack trace is not removed due to a wrong stack start function being used. It also fixes the wrong operator caused by the same reason. This only applies in case an validation object was used to validate the rejection passed to `assert.reject()` as first argument. PR-URL: #27047 Reviewed-By: Rich Trott <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent eb2d416 commit 75463a9

File tree

2 files changed

+35
-10
lines changed

2 files changed

+35
-10
lines changed

lib/assert.js

+10-10
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,7 @@ class Comparison {
502502
}
503503
}
504504

505-
function compareExceptionKey(actual, expected, key, message, keys) {
505+
function compareExceptionKey(actual, expected, key, message, keys, fn) {
506506
if (!(key in actual) || !isDeepStrictEqual(actual[key], expected[key])) {
507507
if (!message) {
508508
// Create placeholder objects to create a nice output.
@@ -513,24 +513,24 @@ function compareExceptionKey(actual, expected, key, message, keys) {
513513
actual: a,
514514
expected: b,
515515
operator: 'deepStrictEqual',
516-
stackStartFn: assert.throws
516+
stackStartFn: fn
517517
});
518518
err.actual = actual;
519519
err.expected = expected;
520-
err.operator = 'throws';
520+
err.operator = fn.name;
521521
throw err;
522522
}
523523
innerFail({
524524
actual,
525525
expected,
526526
message,
527-
operator: 'throws',
528-
stackStartFn: assert.throws
527+
operator: fn.name,
528+
stackStartFn: fn
529529
});
530530
}
531531
}
532532

533-
function expectedException(actual, expected, msg) {
533+
function expectedException(actual, expected, msg, fn) {
534534
if (typeof expected !== 'function') {
535535
if (isRegExp(expected))
536536
return expected.test(actual);
@@ -548,9 +548,9 @@ function expectedException(actual, expected, msg) {
548548
expected,
549549
message: msg,
550550
operator: 'deepStrictEqual',
551-
stackStartFn: assert.throws
551+
stackStartFn: fn
552552
});
553-
err.operator = 'throws';
553+
err.operator = fn.name;
554554
throw err;
555555
}
556556

@@ -570,7 +570,7 @@ function expectedException(actual, expected, msg) {
570570
expected[key].test(actual[key])) {
571571
continue;
572572
}
573-
compareExceptionKey(actual, expected, key, msg, keys);
573+
compareExceptionKey(actual, expected, key, msg, keys, fn);
574574
}
575575
return true;
576576
}
@@ -676,7 +676,7 @@ function expectsError(stackStartFn, actual, error, message) {
676676
stackStartFn
677677
});
678678
}
679-
if (error && expectedException(actual, error, message) === false) {
679+
if (error && !expectedException(actual, error, message, stackStartFn)) {
680680
throw actual;
681681
}
682682
}

test/parallel/test-assert-async.js

+25
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ promises.push(assert.rejects(
9696
assert.strictEqual(err.message,
9797
'Got unwanted rejection.\nActual message: "Failed"');
9898
assert.strictEqual(err.operator, 'doesNotReject');
99+
assert.ok(err.stack);
99100
assert.ok(!err.stack.includes('at Function.doesNotReject'));
100101
return true;
101102
};
@@ -121,5 +122,29 @@ promises.push(assert.rejects(
121122
}
122123
));
123124

125+
{
126+
const handler = (generated, actual, err) => {
127+
assert.strictEqual(err.generatedMessage, generated);
128+
assert.strictEqual(err.code, 'ERR_ASSERTION');
129+
assert.strictEqual(err.actual, actual);
130+
assert.strictEqual(err.operator, 'rejects');
131+
assert(/rejects/.test(err.stack));
132+
return true;
133+
};
134+
const err = new Error();
135+
promises.push(assert.rejects(
136+
assert.rejects(Promise.reject(null), { code: 'FOO' }),
137+
handler.bind(null, true, null)
138+
));
139+
promises.push(assert.rejects(
140+
assert.rejects(Promise.reject(5), { code: 'FOO' }, 'AAAAA'),
141+
handler.bind(null, false, 5)
142+
));
143+
promises.push(assert.rejects(
144+
assert.rejects(Promise.reject(err), { code: 'FOO' }, 'AAAAA'),
145+
handler.bind(null, false, err)
146+
));
147+
}
148+
124149
// Make sure all async code gets properly executed.
125150
Promise.all(promises).then(common.mustCall());

0 commit comments

Comments
 (0)