Skip to content

Commit

Permalink
fix(lib/test): stack traces when res.name is Error, not string
Browse files Browse the repository at this point in the history
When executing tests, the res.name property
(as constructed in the ./lib/test.js#_assert method)
is actually not a string but the error that was thrown.
This (assuming edge case) combined with
extra.error and opts.error both being falsy ends up
producing this situation where feeding res.name into
the Error constructor makes the original error's stack
trace disappear and only it's message remains with the
newly constructed Error instance holding a completely
generic stack trace that's internal to tape's source code
(and therefore not much use when a test is failing due to
some code is throwing exceptions instead of failing an
assertion).

Signed-off-by: Peter Somogyvari <[email protected]>
  • Loading branch information
petermetz committed Oct 16, 2020
1 parent e142c29 commit c40ec63
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 4 deletions.
3 changes: 2 additions & 1 deletion lib/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,8 @@ Test.prototype._assert = function assert(ok, opts) {
this._ok = !!(this._ok && ok);

if (!ok && !res.todo) {
res.error = defined(extra.error, opts.error, new Error(res.name));
var anError = res.name instanceof Error ? res.name : new Error(res.name);
res.error = defined(extra.error, opts.error, anError);
}

if (!ok) {
Expand Down
3 changes: 2 additions & 1 deletion test/async-await.js
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,8 @@ tap.test('async-error', function (t) {
' ---',
' operator: fail',
' stack: |-',
' Error: Error: oopsie',
' Error: oopsie',
' at Test.myTest ($TEST/async-await/async-error.js:$LINE:$COL)',
' [... stack stripped ...]',
' ...',
'',
Expand Down
10 changes: 8 additions & 2 deletions test/promise_fail.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,10 @@ tap.test('callback returning rejected promise should cause that test (and only t
' ---',
' operator: fail',
' stack: |-',
' Error: Error: rejection message',
' Error: rejection message',
' at $TEST/promises/fail.js:$LINE:$COL',
' [... stack stripped ...]',
' at Test.<anonymous> ($TEST/promises/fail.js:$LINE:$COL)',
' [... stack stripped ...]',
' ...',
'# after',
Expand Down Expand Up @@ -78,7 +81,10 @@ tap.test('subtest callback returning rejected promise should cause that subtest
' ---',
' operator: fail',
' stack: |-',
' Error: Error: rejection message',
' Error: rejection message',
' at $TEST/promises/subTests.js:$LINE:$COL',
' [... stack stripped ...]',
' at Test.<anonymous> ($TEST/promises/subTests.js:$LINE:$COL)',
' [... stack stripped ...]',
' ...',
'# sub test that should pass',
Expand Down

0 comments on commit c40ec63

Please sign in to comment.