TodoList 만들기

TodoList 는 여러 todo 객체가 들어있는 todos 배열을 props 로 받아와서 컴포넌트로 렌더링해줍니다.

우선 비어있는 컴포넌트를 먼저 만들어주세요.

TodoList.js

import React from 'react';

const TodoList = () => {
  return (
    <ul>

    </ul>
  );
};

export default TodoList;

이제 이 컴포넌트를 위한 테스트 코드를 작성해봅시다.

TodoList.test.js

import React from 'react';
import { render } from 'react-testing-library';
import TodoList from './TodoList';

describe('TodoList', () => {
  const sampleTodos = [
    {
      id: 1,
      text: 'TDD 배우기',
      done: true
    },
    {
      id: 2,
      text: 'react-testing-library 사용하기',
      done: false
    }
  ];

  it('renders correctly', () => {
    const { container } = render(<TodoList todos={sampleTodos} />);
    const items = container.querySelectorAll('li'); // li 태그로 조회
    expect(items.length).toBe(2); // 두개의 li 태그가 렌더링됨
  });
});

그 다음에는 위 테스트 케이스를 통과 시키기 위하여 컴포넌트에서 props 로 받아온 todos 배열을 map 을 통하여 컴포넌트로 렌더링해주겠습니다.

TodoList.js

import React from 'react';
import TodoItem from './TodoItem';

const TodoList = ({ todos }) => {
  return (
    <ul>
      {todos.map(todo => (
        <TodoItem key={todo.id} todo={todo} />
      ))}
    </ul>
  );
};

export default TodoList;

간단하죠? 테스트 코드가 통과되었는지 확인하세요.

그 다음에는 이 컴포넌트에서 onRemove 와 onToggle 을 props 로 받아와서 그대로 TodoItem 컴포넌트들에게도 전달해주겠습니다. 이 작업을 위한 테스트 코드를 작성해봅시다.

TodoList.test.js

import React from 'react';
import { render, fireEvent } from 'react-testing-library';
import TodoList from './TodoList';

describe('TodoList', () => {
  const sampleTodos = [
    {
      id: 1,
      text: 'TDD 배우기',
      done: true
    },
    {
      id: 2,
      text: 'react-testing-library 사용하기',
      done: false
    }
  ];

  it('renders correctly', () => {
    const { container } = render(<TodoList todos={sampleTodos} />);
    const items = container.querySelectorAll('li'); // li 태그로 조회
    expect(items.length).toBe(2); // 두개의 li 태그가 렌더링됨
  });

  it('calls onToggle and onRemove', () => {
    const onToggle = jest.fn();
    const onRemove = jest.fn();
    const { getByText } = render(
      <TodoList todos={sampleTodos} onToggle={onToggle} onRemove={onRemove} />
    );
    fireEvent.click(getByText('TDD 배우기')); // 텍스트 부분 클릭 (onToggle)
    fireEvent.click(getByText('삭제')); // 삭제 버튼 클릭 (onRemove)

    expect(onToggle).toBeCalled(); // 호출 됐어야 함
    expect(onRemove).toBeCalled(); // 호출 됐어야 함
  });
});

이 테스트 코드를 통과시키기 위해서 onToggle 과 onRemove 를 TodoItem 컴포넌트에게 그대로 전달시키세요.

TodoList.js

import React from 'react';
import TodoItem from './TodoItem';

const TodoList = ({ todos, onToggle, onRemove }) => {
  return (
    <ul>
      {todos.map(todo => (
        <TodoItem
          key={todo.id}
          todo={todo}
          onToggle={onToggle}
          onRemove={onRemove}
        />
      ))}
    </ul>
  );
};

export default TodoList;

코드를 저장하고 방금 작성한 테스트 코드가 통과하는지 확인해보세요.

results matching ""

    No results matching ""