Skip to content

cleanup functions from beforeEach/All hooks are not executed in a reverse order with sequence.hooks: "stack" #7493

@hi-ogawa

Description

@hi-ogawa

Describe the bug

My initial expectation was cleanup functions should be executed in a reverse order, i.e.

beforeEach(() => {
  console.log('setup A');
  return () => {
    console.log('cleanup A');
  };
});

beforeEach(() => {
  console.log('setup B');
  return () => {
    console.log('cleanup B');
  };
});

it('foo', () => {});

should work like

beforeEach(() => {
  console.log('setup A');
});

afterEach(() => {
  console.log('cleanup A');
});

beforeEach(() => {
  console.log('setup B');
});

afterEach(() => {
  console.log('cleanup B');
});

it('foo', () => {});

However, the 1st one outputs

setup A
setup B
cleanup A
cleanup B

and the 2nd one outputs

setup A
setup B
cleanup B
cleanup A

Reproduction

https://stackblitz.com/edit/vitest-dev-vitest-nzpkgksr?file=test%2Frepro.test.ts

System Info

System:
    OS: Linux 5.0 undefined
    CPU: (8) x64 Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
    Memory: 0 Bytes / 0 Bytes
    Shell: 1.0 - /bin/jsh
  Binaries:
    Node: 18.20.3 - /usr/local/bin/node
    Yarn: 1.22.19 - /usr/local/bin/yarn
    npm: 10.2.3 - /usr/local/bin/npm
    pnpm: 8.15.6 - /usr/local/bin/pnpm
  npmPackages:
    @vitest/ui: latest => 3.0.5 
    vite: latest => 6.1.0 
    vitest: latest => 3.0.5

Used Package Manager

npm

Validations

Metadata

Metadata

Assignees

Labels

p3-minor-bugAn edge case that only affects very specific usage (priority)

Type

Projects

Status

Approved

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions