mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
fix(test runner): make sure we always teardown all fixtures (#8158)
Even if one of the fixtures throws, we should teardown all of them so that we can run afterAll hooks.
This commit is contained in:
parent
f3b35b2bbd
commit
d32d50a906
@ -223,14 +223,23 @@ export class FixtureRunner {
|
||||
}
|
||||
|
||||
async teardownScope(scope: FixtureScope) {
|
||||
let error: Error | undefined;
|
||||
// Teardown fixtures in the reverse order.
|
||||
const fixtures = Array.from(this.instanceForId.values()).reverse();
|
||||
for (const fixture of fixtures) {
|
||||
if (fixture.registration.scope === scope)
|
||||
await fixture.teardown();
|
||||
if (fixture.registration.scope === scope) {
|
||||
try {
|
||||
await fixture.teardown();
|
||||
} catch (e) {
|
||||
if (error === undefined)
|
||||
error = e;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (scope === 'test')
|
||||
this.testScopeClean = true;
|
||||
if (error !== undefined)
|
||||
throw error;
|
||||
}
|
||||
|
||||
async resolveParametersAndRunHookOrTest(fn: Function, workerInfo: WorkerInfo, testInfo: TestInfo | undefined, paramsStepCallback?: CompleteStepCallback) {
|
||||
|
||||
@ -349,3 +349,55 @@ test('beforeAll failure should prevent the test, but not afterAll', async ({ run
|
||||
'%%afterAll',
|
||||
]);
|
||||
});
|
||||
|
||||
test('fixture error should not prevent afterAll', async ({ runInlineTest }) => {
|
||||
const result = await runInlineTest({
|
||||
'a.test.js': `
|
||||
const test = pwt.test.extend({
|
||||
foo: async ({}, use) => {
|
||||
await use('foo');
|
||||
throw new Error('bad fixture');
|
||||
},
|
||||
});
|
||||
test('good test', ({ foo }) => {
|
||||
console.log('\\n%%test');
|
||||
});
|
||||
test.afterAll(() => {
|
||||
console.log('\\n%%afterAll');
|
||||
});
|
||||
`,
|
||||
});
|
||||
expect(result.exitCode).toBe(1);
|
||||
expect(result.failed).toBe(1);
|
||||
expect(result.output).toContain('bad fixture');
|
||||
expect(result.output.split('\n').filter(line => line.startsWith('%%'))).toEqual([
|
||||
'%%test',
|
||||
'%%afterAll',
|
||||
]);
|
||||
});
|
||||
|
||||
test('afterEach failure should not prevent afterAll', async ({ runInlineTest }) => {
|
||||
const result = await runInlineTest({
|
||||
'a.test.js': `
|
||||
const { test } = pwt;
|
||||
test('good test', ({ }) => {
|
||||
console.log('\\n%%test');
|
||||
});
|
||||
test.afterEach(() => {
|
||||
console.log('\\n%%afterEach');
|
||||
throw new Error('bad afterEach');
|
||||
})
|
||||
test.afterAll(() => {
|
||||
console.log('\\n%%afterAll');
|
||||
});
|
||||
`,
|
||||
});
|
||||
expect(result.exitCode).toBe(1);
|
||||
expect(result.failed).toBe(1);
|
||||
expect(result.output).toContain('bad afterEach');
|
||||
expect(result.output.split('\n').filter(line => line.startsWith('%%'))).toEqual([
|
||||
'%%test',
|
||||
'%%afterEach',
|
||||
'%%afterAll',
|
||||
]);
|
||||
});
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user