Files
formipay/node_modules/eslint-plugin-jest/docs/rules/no-hooks.md
dwindown e8fbfb14c1 fix: prevent asset conflicts between React and Grid.js versions
Add coexistence checks to all enqueue methods to prevent loading
both React and Grid.js assets simultaneously.

Changes:
- ReactAdmin.php: Only enqueue React assets when ?react=1
- Init.php: Skip Grid.js when React active on admin pages
- Form.php, Coupon.php, Access.php: Restore classic assets when ?react=0
- Customer.php, Product.php, License.php: Add coexistence checks

Now the toggle between Classic and React versions works correctly.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-18 17:02:14 +07:00

2.8 KiB

Disallow setup and teardown hooks (no-hooks)

Jest provides global functions for setup and teardown tasks, which are called before/after each test case and each test suite. The use of these hooks promotes shared state between tests.

Rule details

This rule reports for the following function calls:

  • beforeAll
  • beforeEach
  • afterAll
  • afterEach

Examples of incorrect code for this rule:

/* eslint jest/no-hooks: "error" */

function setupFoo(options) {
  /* ... */
}

function setupBar(options) {
  /* ... */
}

describe('foo', () => {
  let foo;

  beforeEach(() => {
    foo = setupFoo();
  });

  afterEach(() => {
    foo = null;
  });

  it('does something', () => {
    expect(foo.doesSomething()).toBe(true);
  });

  describe('with bar', () => {
    let bar;

    beforeEach(() => {
      bar = setupBar();
    });

    afterEach(() => {
      bar = null;
    });

    it('does something with bar', () => {
      expect(foo.doesSomething(bar)).toBe(true);
    });
  });
});

Examples of correct code for this rule:

/* eslint jest/no-hooks: "error" */

function setupFoo(options) {
  /* ... */
}

function setupBar(options) {
  /* ... */
}

describe('foo', () => {
  it('does something', () => {
    const foo = setupFoo();
    expect(foo.doesSomething()).toBe(true);
  });

  it('does something with bar', () => {
    const foo = setupFoo();
    const bar = setupBar();
    expect(foo.doesSomething(bar)).toBe(true);
  });
});

Options

{
  "jest/no-hooks": [
    "error",
    {
      "allow": ["afterEach", "afterAll"]
    }
  ]
}

allow

This array option controls which Jest hooks are checked by this rule. There are four possible values:

  • "beforeAll"
  • "beforeEach"
  • "afterAll"
  • "afterEach"

By default, none of these options are enabled (the equivalent of { "allow": [] }).

Examples of incorrect code for the { "allow": ["afterEach"] } option:

/* eslint jest/no-hooks: ["error", { "allow": ["afterEach"] }] */

function setupFoo(options) {
  /* ... */
}

let foo;

beforeEach(() => {
  foo = setupFoo();
});

afterEach(() => {
  jest.resetModules();
});

test('foo does this', () => {
  // ...
});

test('foo does that', () => {
  // ...
});

Examples of correct code for the { "allow": ["afterEach"] } option:

/* eslint jest/no-hooks: ["error", { "allow": ["afterEach"] }] */

function setupFoo(options) {
  /* ... */
}

afterEach(() => {
  jest.resetModules();
});

test('foo does this', () => {
  const foo = setupFoo();
  // ...
});

test('foo does that', () => {
  const foo = setupFoo();
  // ...
});

When Not To Use It

If you prefer using the setup and teardown hooks provided by Jest, you can safely disable this rule.

Further Reading