jest/require-hook 스타일
작동 방식
이 규칙은 테스트 파일의 최상위 또는 describe 본문 내부에 위치한 모든 표현식을 경고합니다. 다만 다음의 경우는 예외입니다:
import문const변수let선언 및null또는undefined로의 초기화- 클래스
- 타입
- 표준 Jest 전역 함수 호출
왜 좋지 않은가?
훅 외부에서 세팅 및 정리 코드를 사용하면 예측 불가능한 테스트 동작이 발생할 수 있습니다. 최상위에서 실행되는 코드는 테스트 파일이 로드될 때 실행되며, 실제로 테스트가 실행될 때가 아닙니다. 이는 테스트 격리 문제를 일으키고 테스트 실행 순서에 의존하게 만들 수 있습니다. 적절한 훅인 beforeEach, beforeAll, afterEach, afterAll을 사용하면 세팅 및 정리 코드가 올바른 시점에 실행되고 테스트 격리가 유지됩니다.
예시
이 규칙에 잘못된 코드 예시:
javascript
import { database, isCity } from "../database";
import { Logger } from "../../../src/Logger";
import { loadCities } from "../api";
jest.mock("../api");
const initializeCityDatabase = () => {
database.addCity("Vienna");
database.addCity("San Juan");
database.addCity("Wellington");
};
const clearCityDatabase = () => {
database.clear();
};
initializeCityDatabase();
test("도시를 지속적으로 저장한다", () => {
expect(database.cities.length).toHaveLength(3);
});
test("도시 데이터베이스에 비엔나 포함됨", () => {
expect(isCity("Vienna")).toBeTruthy();
});
test("도시 데이터베이스에 산후안 포함됨", () => {
expect(isCity("San Juan")).toBeTruthy();
});
describe("API에서 도시를 로드할 때", () => {
let consoleWarnSpy = jest.spyOn(console, "warn");
loadCities.mockResolvedValue(["Wellington", "London"]);
it("도시 중복 없음", async () => {
await database.loadCities();
expect(database.cities).toHaveLength(4);
});
});
clearCityDatabase();이 규칙에 올바른 코드 예시:
javascript
import { database, isCity } from "../database";
import { Logger } from "../../../src/Logger";
import { loadCities } from "../api";
jest.mock("../api");
const initializeCityDatabase = () => {
database.addCity("Vienna");
database.addCity("San Juan");
database.addCity("Wellington");
};
const clearCityDatabase = () => {
database.clear();
};
beforeEach(() => {
initializeCityDatabase();
});
test("도시를 지속적으로 저장한다", () => {
expect(database.cities.length).toHaveLength(3);
});
test("도시 데이터베이스에 비엔나 포함됨", () => {
expect(isCity("Vienna")).toBeTruthy();
});
test("도시 데이터베이스에 산후안 포함됨", () => {
expect(isCity("San Juan")).toBeTruthy();
});
describe("API에서 도시를 로드할 때", () => {
let consoleWarnSpy;
beforeEach(() => {
consoleWarnSpy = jest.spyOn(console, "warn");
loadCities.mockResolvedValue(["Wellington", "London"]);
});
it("도시 중복 없음", async () => {
await database.loadCities();
expect(database.cities).toHaveLength(4);
});
});
afterEach(() => {
clearCityDatabase();
});이 규칙은 eslint-plugin-vitest와 호환됩니다. 이를 사용하려면 .oxlintrc.json에 다음 설정을 추가하세요:
json
{
"rules": {
"vitest/require-hook": "error"
}
}구성
이 규칙은 다음 속성을 가진 구성 객체를 수락합니다:
allowedFunctionCalls
type: string[]
기본값: []
훅 외부에서 호출할 수 있는 함수 이름 배열입니다.
사용 방법
이 규칙을 활성화하려면 구성 파일 또는 CLI를 사용할 수 있습니다:
json
{
"plugins": ["jest"],
"rules": {
"jest/require-hook": "error"
}
}bash
oxlint --deny jest/require-hook --jest-plugin