Skip to content

Commit d6a194d

Browse files
authored
✅test : 학생-행동페이지 테스트코드 추가
✅test : 학생-행동페이지 테스트코드 추가
2 parents 97d4389 + 61e76f0 commit d6a194d

3 files changed

Lines changed: 92 additions & 1 deletion

File tree

package-lock.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// __tests__/pages/StudentBehavior.test.tsx
2+
import React from "react";
3+
import { render, screen } from "@testing-library/react";
4+
import Behavior from "@/pages/student/behavior";
5+
6+
// BehaviorContent mock (default export)
7+
jest.mock("@/components/behavior/StudentBehaviorContent", () => ({
8+
__esModule: true,
9+
default: () => <div data-testid="behavior-content">BehaviorContent</div>,
10+
}));
11+
12+
// StudentHeader mock (named export)
13+
jest.mock("@/components/shared/StudentHeader", () => ({
14+
__esModule: true,
15+
StudentHeader: ({ children }: any) => <div data-testid="student-header">{children}</div>,
16+
}));
17+
18+
describe("<Behavior />", () => {
19+
it("BehaviorContent가 렌더링된다", () => {
20+
render(<Behavior />);
21+
expect(screen.getByTestId("behavior-content")).toBeInTheDocument();
22+
});
23+
24+
it("getLayout 함수가 StudentHeader로 감싸서 반환한다", () => {
25+
const Dummy = <div>dummy</div>;
26+
27+
const layout = Behavior.getLayout(Dummy);
28+
const { getByTestId } = render(layout);
29+
expect(getByTestId("student-header")).toBeInTheDocument();
30+
expect(getByTestId("student-header")).toContainElement(screen.getByText("dummy"));
31+
});
32+
});
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// __tests__/components/StudentBehaviorContent.test.tsx
2+
import React from "react";
3+
import { render, screen, waitFor } from "@testing-library/react";
4+
import BehaviorContent from "@/components/behavior/StudentBehaviorContent";
5+
import * as getBehaviorApi from "@/api/student/getBehavior";
6+
import useStudentFilterStore from "@/store/student-filter-store";
7+
import useSelectedDate from "@/store/selected-date-store";
8+
9+
// store mock
10+
jest.mock("@/store/student-filter-store");
11+
jest.mock("@/store/selected-date-store");
12+
// API mock
13+
jest.mock("@/api/student/getBehavior");
14+
15+
describe("<BehaviorContent />", () => {
16+
beforeEach(() => {
17+
jest.clearAllMocks();
18+
// store mock 리턴값
19+
(useStudentFilterStore as unknown as jest.Mock).mockReturnValue({
20+
grade: "1",
21+
classNumber: "2",
22+
studentId: "3",
23+
});
24+
(useSelectedDate as unknown as jest.Mock).mockReturnValue({
25+
year: "2025",
26+
});
27+
});
28+
29+
it("행동특성/종합의견이 API 데이터로 렌더링된다", async () => {
30+
(getBehaviorApi.GetBehavior as jest.Mock).mockResolvedValueOnce({
31+
behavior: "성실하게 생활함",
32+
generalComment: "종합적으로 우수함",
33+
});
34+
35+
render(<BehaviorContent />);
36+
expect(screen.getByText("행동특성")).toBeInTheDocument();
37+
expect(screen.getByText("종합의견")).toBeInTheDocument();
38+
39+
// 비동기 데이터가 textarea에 반영되는지 확인
40+
await waitFor(() => {
41+
expect(screen.getByDisplayValue("성실하게 생활함")).toBeInTheDocument();
42+
expect(screen.getByDisplayValue("종합적으로 우수함")).toBeInTheDocument();
43+
});
44+
});
45+
46+
it("API 에러 시 콘솔에 에러가 찍혀도 렌더링은 된다", async () => {
47+
const errorSpy = jest.spyOn(console, "error").mockImplementation(() => {});
48+
(getBehaviorApi.GetBehavior as jest.Mock).mockRejectedValueOnce(new Error("API 실패"));
49+
50+
render(<BehaviorContent />);
51+
expect(screen.getByText("행동특성")).toBeInTheDocument();
52+
expect(screen.getByText("종합의견")).toBeInTheDocument();
53+
54+
await waitFor(() => {
55+
expect(errorSpy).toHaveBeenCalled();
56+
});
57+
58+
errorSpy.mockRestore();
59+
});
60+
});

0 commit comments

Comments
 (0)