

div나 class 이름으로 찾는 것은 좋지 않습니다. 디자인이 바뀌면 테스트도 깨지기 쉽거든요.
대신 button, heading, textbox 등 HTML 태그가 가진 본래의 역할을 기준으로 찾습니다.data-testid 속성을 달아서 찾습니다.Counter.tsx)을 만들지도 않은 상태에서, 테스트 파일부터 만듭니다.
src/components 폴더를 만들고 그 안에 Counter.test.tsx를 생성해 주세요.import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
// Counter 컴포넌트는 아직 없지만 import 합니다 (에러 발생 예정)
import Counter from './Counter';
describe('Counter 컴포넌트 동작 테스트', () => {
test('초기값은 0이며, + 버튼을 누르면 숫자가 1 증가한다', async () => {
// 1. User Event 설정 (사용자의 동작을 시뮬레이션하는 객체)
const user = userEvent.setup();
// 2. 렌더링 (아직 컴포넌트가 없어서 여기서 빨간 줄이 뜹니다)
render(<Counter />);
// 3. 요소 찾기 (쿼리)
// "현재 숫자: 0"이라는 텍스트가 있는지 확인
const initialText = screen.getByText('현재 숫자: 0');
// "+" 라는 이름을 가진 버튼(role=button) 찾기
const incrementBtn = screen.getByRole('button', { name: '+' });
// 4. 초기 상태 검증
expect(initialText).toBeInTheDocument();
expect(incrementBtn).toBeInTheDocument();
// 5. 사용자 행동 (클릭)
await user.click(incrementBtn);
// 6. 결과 검증
// 클릭 후에는 "현재 숫자: 1"이 화면에 보여야 함
expect(screen.getByText('현재 숫자: 1')).toBeInTheDocument();
});
});fireEvent보다 더 실제 브라우저 동작에 가까운 userEvent를 사용합니다.div나 class가 아니라, "이름이 +인 버튼"이라는 역할을 명확히 찾습니다.npm test
Counter 컴포넌트가 없으니 파일 자체를 찾을 수 없다는 에러가 나거나, 컴포넌트를 빈 껍데기로 만들어도 요소를 찾을 수 없다는 에러가 날 것입니다.git clone https://github.com/PROMLEE/my-tdd-app.git
cd my-tdd-app
git checkout part3getByRole을 최우선으로 사용하여, HTML 구조가 바뀌어도 깨지지 않는 튼튼한 테스트를 만듭니다.다음 시간에는 이 빨간색 에러를 초록색으로 바꾸는4편. 테스트를 통과시키는 기본 컴포넌트 구현을 진행하겠습니다.
getBy, queryBy, findBy)의 차이점을 설명하는 공식 문서입니다.