Skip to content
← Back to rules

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

참고자료