본문 바로가기
Aplication test

리액트 테스트코드 - list , header

by ddddbbbb 2023. 10. 30.

list 컴포넌트 : 

   테스트항목 :
      get 요청을 통해 받아온 Todo데이터를 랜더링하고있는지

 

      완료하기/취소하기 버튼을 눌렀을때 _changeTodo API에 정확한 인자를 전달하는지

 

 

 

 

우선 list 컴포넌트의 get 요청을 처리하기위해 get 요청결과를 임시로만들어서 테스트 진행했습니다

 

describe("listComponent", () => {
  it("get API를 통해 받아온 데이터 랜더링 확인", async () => {
    //path가 running 일때 받아올 더미데이터입니다
    const responseData = [
      {
        id: "1",
        title: "Dummy Task 1",
        detail: "Sample detail",
        state: false,
        startDate: "2023-10-30",
        endDate: "2023-10-30",
      },
      {
        id: "2",
        title: "Dummy Task 2",
        detail: "Sample detail",
        state: false,
        startDate: "2023-10-30",
        endDate: "2023-10-30",
      },
    ];
    //path가 running 일때 GET요청 결과 목업
    mockAxios.onGet(`${BASE_URL}/todos/running`).reply(200, responseData);

    const { container } = render(
      <MemoryRouter>
        <Contents path="total" />
      </MemoryRouter>
    );

    await waitFor(() => {
      // 데이터가 렌더링되었는지 확인합니다.
      expect(container).toHaveTextContent("Dummy Task 1");
      expect(container).toHaveTextContent("Dummy Task 2");
    });
  });

 

 

 

 

그 다음 완료하기버튼을 눌렀을 때 _changeTodo함수 호출에 정확한 인자가 전달되는지 테스트 했습니다

 

mock get API는 위의테스트에서 동작을 했기에 아래코드가 적용이되어있습니다     

mockAxios.onGet(`${BASE_URL}/todos/running`).reply(200, responseData);

 

 it("완료하기 버튼 눌렀을 때", async () => {
    const mockChangeTodo = jest.spyOn(todosApi, "_changeTodo");

    render(
      <MemoryRouter>
        <Contents path="total" />
      </MemoryRouter>
    );

    await waitFor(async () => {
      //완료하기 버튼이 랜더링 되었는지 확인합니다
      const completeButtons = screen.getAllByText("완료하기");
      // 더미데이터가 2개의 객체라 첫 객체의 버튼을 지정
      const targetButton = completeButtons[0]; 
      fireEvent.click(targetButton);
    });

    // mockChangeTodo 호출에 제대로 된 값이 들어갔는지 확인
    expect(mockChangeTodo).toHaveBeenCalledWith(
      {
        id: "1",
        title: "Dummy Task 1",
        detail: "Sample detail",
        state: false,
        startDate: "2023-10-30",
        endDate: "2023-10-30",
      },
      true
    );
  });

 

 

 

 

그 다음 취소하기버튼을 눌렀을 때 _changeTodo함수 호출에 정확한 인자가 전달되는지 테스트 했습니다

 

  it("취소하기 버튼 눌렀을 때", async () => {
    //path가 done일때 받아오는 더미데이터입니다
    const responseData2 = [
      {
        id: "1",
        title: "Dummy Task 1",
        detail: "Sample detail",
        state: true,
        startDate: "2023-10-30",
        endDate: "2023-10-30",
      },
      {
        id: "2",
        title: "Dummy Task 2",
        detail: "Sample detail",
        state: true,
        startDate: "2023-10-30",
        endDate: "2023-10-30",
      },
    ];

    //path가 done 일때 GET요청 결과 목업
    mockAxios.onGet(`${BASE_URL}/todos/done`).reply(200, responseData2);

    const mockChangeTodo = jest.spyOn(todosApi, "_changeTodo");

    render(
      <MemoryRouter>
        <Contents path="done" />
      </MemoryRouter>
    );

    await waitFor(async () => {
      //취소하기 버튼이 랜더링되었는지 확인합니다
      const completeButtons = screen.getAllByText("취소하기");
      // 첫 번째 버튼 선택
      const targetButton = completeButtons[0]; 
      fireEvent.click(targetButton);
    });

    // mockChangeTodo 호출에 제대로 된 값이 들어갔는지 확인
    expect(mockChangeTodo).toHaveBeenCalledWith(
      {
        id: "1",
        title: "Dummy Task 1",
        detail: "Sample detail",
        state: true,
        startDate: "2023-10-30",
        endDate: "2023-10-30",
      },
      false
    );
  });

 

 

header 컴포넌트 :

  테스트 항목 :
      각 헤더에 보여줘야할 '홈' , '투두 작성' , '투두 전체' , '로그인'이 포함되었는지
  
 it('Header_render', () => {
    const { container } = render(
      <MemoryRouter> {/* MemoryRouter로 감싸기 */}
        <Header />
      </MemoryRouter>
    );
    
    // header에 각 메뉴가 있는지 확인
    expect(container).toHaveTextContent('홈');
    expect(container).toHaveTextContent('투두 작성');
    expect(container).toHaveTextContent('투두 전체');
    expect(container).toHaveTextContent('로그인');
  });

 

 

 

이렇게 테스트를 진행해봤는데 추가적으로 테스트해야하는 부분이나 

수정해야하는 사항을 공부해서 추가해보겠습니다 

'Aplication test' 카테고리의 다른 글

테스트 코드의 의의  (0) 2024.01.26
리액트 테스트코드 - add  (0) 2023.10.31
리액트 테스트 코드 - 2  (0) 2023.10.30
리액트 테스트코드 - 1  (0) 2023.10.28
리액트 테스트코드 - intro  (0) 2023.10.25