vitest/require-hook
Require setup and teardown code to be inside a hook
Code at the top level of a test file, or directly in the body of a describe, runs once while Vitest collects the tests. It runs even if every test in that block is skipped, and the state it builds is shared by all tests, so one test can break the next. Put it in beforeAll, beforeEach, afterEach or afterAll.
The rule reports two things in those places:
- a statement that's only a function call, such as
setup(); - a
letorvarthat starts with a value other thannullorundefined
const declarations are allowed. So are calls to describe, test, it, bench and the hooks, and calls on vi, such as vi.mock().
The rule checks every file it's turned on for, not only tests. Only turn it on for your test files.
Configure#
Off by default. To turn it on:
bunfig.toml
[lint.rules]
"vitest/require-hook" = "error" # or "warn"Every option, set to its default:
bunfig.toml
[lint.rules]
"vitest/require-hook" = ["error", {
allowedFunctionCalls = [], # list of strings
}]Examples#
example.js3 problems
import { describe, expect, test } from "vitest";
let db = connect();Require setup and teardown code to be within a hook.
db.seed(["ada", "grace"])Require setup and teardown code to be within a hook.;
describe("users", () => {
clearCache()Require setup and teardown code to be within a hook.;
test("finds a user", () => {
expect(db.find("ada")).toBeDefined();
});
});example.jsNo problems
import { beforeAll, beforeEach, describe, expect, test, vi } from "vitest";
vi.mock("./mailer");
const names = ["ada", "grace"];
let db;
beforeAll(() => {
db = connect();
db.seed(names);
});
describe("users", () => {
beforeEach(() => {
clearCache();
});
test("finds a user", () => {
expect(db.find("ada")).toBeDefined();
});
});Options#
| Option | Default | What it does |
|---|---|---|
allowedFunctionCalls | [] | Names of functions that you can call outside a hook. Write a method with its object, like "expect.extend". |
expect.extend() is reported unless you list it:
example.js1 problem
import { expect, test } from "vitest";
expect.extend({ toBeUser })Require setup and teardown code to be within a hook.;
test("finds a user", () => {
expect(db.find("ada")).toBeUser();
});example.jswith
{ "allowedFunctionCalls": ["expect.extend"] }No problemsimport { expect, test } from "vitest";
expect.extend({ toBeUser });
test("finds a user", () => {
expect(db.find("ada")).toBeUser();
});