test_runner: run t.after() if test body throws

This commit fixes a bug where t.after() was not called if the
test body threw an exception.

PR-URL: https://github.com/nodejs/node/pull/45870
Reviewed-By: Moshe Atlow <moshe@atlow.co.il>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
This commit is contained in:
Colin Ihrig authored and GitHub committed 2022-12-17 06:36:15 +00:00
1 parent 12f6da731c
commit 385d595a4f
3 files changed
+35 -4

No files matched your search

+7 -1
View File
@@ -508,6 +508,11 @@ class Test extends AsyncResource {
}
const { args, ctx } = this.getRunArgs();
const after = runOnce(async () => {
if (this.hooks.after.length > 0) {
await this.runHook('after', { args, ctx });
}
});
const afterEach = runOnce(async () => {
if (this.parent?.hooks.afterEach.length > 0) {
await this.parent.runHook('afterEach', { args, ctx });
@@ -549,10 +554,11 @@ class Test extends AsyncResource {
return;
}
await this.runHook('after', { args, ctx });
await after();
await afterEach();
this.pass();
} catch (err) {
try { await after(); } catch { /* Ignore error. */ }
try { await afterEach(); } catch { /* test is already failing, let's the error */ }
if (isTestFailureError(err)) {
if (err.failureType === kTestTimeoutFailure) {
+7
View File
@@ -142,3 +142,10 @@ test('afterEach throws and test fails', async (t) => {
await t.test('1', () => { throw new Error('test'); });
await t.test('2', () => {});
});
test('t.after() is called if test body throws', (t) => {
t.after(() => {
t.diagnostic('- after() called');
});
throw new Error('bye');
});
+21 -3
View File
@@ -475,10 +475,28 @@ not ok 12 - afterEach throws and test fails
error: '2 subtests failed'
code: 'ERR_TEST_FAILURE'
...
1..12
# tests 12
# Subtest: t.after() is called if test body throws
not ok 13 - t.after() is called if test body throws
---
duration_ms: *
failureType: 'testCodeFailure'
error: 'bye'
code: 'ERR_TEST_FAILURE'
stack: |-
*
*
*
*
*
*
*
*
...
# - after() called
1..13
# tests 13
# pass 2
# fail 10
# fail 11
# cancelled 0
# skipped 0
# todo 0