jest: [Bug]: jest-circus doesn't respect beforeAll / beforeEach / afterEach / afterAll order

Version

27.5.1

Steps to reproduce

https://app.circleci.com/pipelines/github/ike18t/ng-mocks/4752/workflows/52fd9352-393d-4011-ad15-c3eaebbacb27/jobs/183399

const triggers: string[] = [];

describe('mock-instance-reset', () => {
  describe('test', () => {
    beforeAll(() => triggers.push('beforeAll:1'));
    afterAll(() => triggers.push('afterAll:1'));

    beforeAll(() => triggers.push('beforeAll:2'));
    afterAll(() => triggers.push('afterAll:2'));

    beforeEach(() => triggers.push('beforeEach:1'));
    beforeEach(() => triggers.push('beforeEach:2'));

    afterEach(() => triggers.push('afterEach:1'));
    afterEach(() => triggers.push('afterEach:2'));

    it('triggers test #1', () => {
      expect(1).toEqual(1);
    });

    it('triggers test #2', () => {
      expect(2).toEqual(2);
    });

    describe('nested', () => {
      beforeAll(() => triggers.push('beforeAll:3'));
      afterAll(() => triggers.push('afterAll:3'));

      beforeEach(() => triggers.push('beforeEach:3'));
      afterEach(() => triggers.push('afterEach:3'));

      it('triggers test #3', () => {
        expect(3).toEqual(3);
      });
    });
  });

  it('has expected order', () => {
    // first before is called the first
    // first after is called the last
    expect(triggers).toEqual([
      'beforeAll:1',
      'beforeAll:2',

      'beforeEach:1',
      'beforeEach:2',
      'afterEach:2',
      'afterEach:1',

      'beforeEach:1',
      'beforeEach:2',
      'afterEach:2',
      'afterEach:1',

      'beforeAll:3',
      'beforeEach:1',
      'beforeEach:2',
      'beforeEach:3',
      'afterEach:3',
      'afterEach:2',
      'afterEach:1',
      'afterAll:3',

      'afterAll:2',
      'afterAll:1',
    ]);
  });
});

Expected behavior

Based on documentation, https://jestjs.io/docs/setup-teardown, before hooks are FIFO, after hooks are LIFO. it works like that in jest-jasmine2, whereas jest-circus doesn’t respect the order.

Actual behavior

jest-circus calls after hooks as FIFO.

        "beforeAll:1",
        "beforeAll:2",
        "beforeEach:1",
        "beforeEach:2",
    -   "afterEach:2", // expected before #1
        "afterEach:1",
    +   "afterEach:2", // called after #1
        "beforeEach:1",
        "beforeEach:2",
    +   "afterEach:1",
        "afterEach:2",
    -   "afterEach:1",
        "beforeAll:3",
        "beforeEach:1",
        "beforeEach:2",
        "beforeEach:3",
        "afterEach:3",
    +   "afterEach:1",
        "afterEach:2",
    -   "afterEach:1",
        "afterAll:3",
    -   "afterAll:2",
        "afterAll:1",
    +   "afterAll:2",

Additional context

No response

Environment

System:
    OS: macOS 12.3.1
    CPU: (16) x64 Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz
  Binaries:
    Node: 16.13.2 - /opt/local/bin/node
    Yarn: 1.22.17 - /opt/local/bin/yarn
    npm: 8.7.0 - /Volumes/MGS/Projects/ng-mocks/node_modules/.bin/npm
  npmPackages:
    jest: 27.5.1 => 27.5.1

About this issue

  • Original URL
  • State: closed
  • Created 2 years ago
  • Reactions: 5
  • Comments: 31 (3 by maintainers)

Commits related to this issue

Most upvoted comments

Bump