PromleeBlog
sitemap
aboutMe

posting thumbnail
테스트를 통과시키는 기본 컴포넌트 구현 - React로 시작하는 TDD 4편
Implementing Basic Component to Pass Tests - TDD with React Part 4

📅

🚀

들어가기 전에 🔗

지난 3편에서 우리는
Counter
컴포넌트에 대한 테스트 코드를 작성하고 시원하게
실패(FAIL)
메시지를 확인했습니다.
이것은 우리가 앞으로 무엇을 해야 할지 알려주는 나침반과 같습니다.

오늘은 이 빨간 불을 초록 불로 바꾸는
Green
단계를 진행하겠습니다.
코드가 조금 엉성해도 괜찮습니다. 일단 테스트를 통과시키는 것에 집중해 봅시다.

🚀

1단계: 최소 렌더링 구조 (껍데기 만들기) 🔗

테스트를 실행했을 때 가장 먼저 발생한 에러는 컴포넌트 파일을 찾을 수 없다는 것이었습니다.
우선 파일부터 만들어서 존재를 알려줍시다.

파일 생성 🔗

src/components/Counter.tsx 파일을 생성합니다.
src/components/Counter.tsx
export default function Counter() {
  return (
    <div>
      {/* 아직은 아무 내용도 없는 빈 껍데기입니다 */}
    </div>
  );
}
이제 테스트 파일(Counter.test.tsx)로 돌아가서, 빨간 줄이 떴던 import 구문을 정상적으로 인식할 수 있게 됩니다.

🚀

2단계: UI 요소 채우기 (정적 구현) 🔗

다시 테스트를 돌려볼까요?
아마 이번에는 이런 에러가 날 것입니다.
TestingLibraryElementError: Unable to find an element with the text: /현재 숫자: 0/
테스트 코드는 "현재 숫자: 0"이라는 글자와 "+" 버튼을 찾고 있는데, 우리가 만든 컴포넌트는 비어있기 때문입니다.
기능은 나중에 생각하고, 일단 화면에 보이는 것부터 하드코딩(직접 입력)으로 넣어봅시다.
src/components/Counter.tsx
export default function Counter() {
  return (
    <div>
      <p>현재 숫자: 0</p>
      <button type="button">+</button>
    </div>
  );
}
이렇게만 작성해도 테스트의 절반은 통과합니다.
RTL
은 "현재 숫자: 0"이라는 텍스트가 화면에 존재하는지, "+" 버튼이 있는지를 확인하고 만족해합니다.

🚀

3단계: 상태 연결하기 (useState) 🔗

이제 마지막 관문이 남았습니다.
테스트 코드는 버튼을 클릭했을 때 숫자가
1
로 변하기를 기대합니다.
하지만 지금은
0
이라고 고정되어 있습니다.

이 문제를 해결하기 위해
React
의 상태 관리 도구인
useState
(훅)를 사용해야 합니다.
사용자의 행동(클릭)에 따라 화면이 바뀌어야 하기 때문입니다.

컴포넌트 완성 🔗

src/components/Counter.tsx
import { useState } from 'react';
 
export default function Counter() {
  // [상태] 숫자를 기억하는 메모리 상자(state)를 만듭니다. 초기값은 0입니다.
  const [count, setCount] = useState(0);
 
  const handleClick = () => {
    // [동작] 기존 값에 1을 더해줍니다.
    setCount(prev => prev + 1);
  };
 
  return (
    <div>
      {/* 고정된 숫자 0 대신, 변하는 값 count를 보여줍니다. */}
      <p>현재 숫자: {count}</p>
      
      {/* 버튼을 누르면 handleClick 함수가 실행됩니다. */}
      <button type="button" onClick={handleClick}>
        +
      </button>
    </div>
  );
}

🚀

4단계: 테스트 통과 확인 (Green) 🔗

이제 모든 구현이 끝났습니다.
정말 테스트를 통과하는지 확인해 볼까요?
터미널을 열고 명령어를 입력합니다.
Terminal
npm test

결과 확인 🔗

결과 확인
결과 확인
 PASS  src/components/Counter.test.tsx
  Counter 컴포넌트 동작 테스트
    ✓ 초기값은 0이며, + 버튼을 누르면 숫자가 1 증가한다 (50 ms)
초록색
PASS
글자가 보인다면 성공입니다!
우리는 방금 TDD 사이클의
Red(실패) -> Green(성공)
단계를 완주했습니다.

테스트 통과 기준 복습 🔗

우리가 작성한 코드가 왜 테스트를 통과했는지 다시 한번 짚어봅시다.

🚀

결론 🔗

소스 코드는 GitHub - Promleeblog/react-tdd-setup 에서 확인할 수 있습니다.
Terminal
git clone https://github.com/PROMLEE/my-tdd-app.git
cd my-tdd-app
git checkout part4
오늘은 실패하는 테스트를 통과시키기 위해 실제 컴포넌트를 구현해 보았습니다.

하지만 지금 코드는 아주 단순해서 개선할 점이 많아 보이지 않습니다.
만약 컴포넌트가 더 복잡해진다면 어떨까요?
다음 시간에는
5편. 컴포넌트 리팩토링과 테스트 유지
를 통해, 테스트 코드가 있는 상태에서 코드를 깔끔하게 다듬는 방법을 알아보겠습니다.

참고 🔗