test('UserSearch 컴포넌트 렌더링',async () => {render(<UserSearch />)awaitscreen.findByText(/로그인 사용자:/)// 이벤트 변경 전screen.debug()fireEvent.change(screen.getByRole('textbox'), { target: { value:'React 테스트 수행' } })// 이벤트 변경 후screen.debug()})
로그인 이후 또는 이벤트를 통한 UI 업데이트 이후, 대상을 찾아 UI에 존재하는지 또는 문서에 포함되어 있는지 테스트를 수행할 수 있습니다.
RTL은 fireEvent 외에도 userEvent를 사용한 테스트를 제공합니다. userEvent가 실제 브라우저의 인터랙션에 근접한 방식으로 fireEvent를 대체하여 사용할 수 있습니다. 가능하다면 userEvent를 사용하는 것을 권장합니다. 단, 현 시점에서는 userEvent가 fireEvent의 모든 기능을 대체할 수 없으니 사용에 주의가 필요합니다.
import { render, screen } from'@testing-library/react';import userEvent from'@testing-library/user-event';import UserSearch from'./UserSearch';describe('UserSearch 테스트', () => {test('UserSearch 컴포넌트 렌더링',async () => {render(<UserSearch />);// 로그인 할 때 까지 대기awaitscreen.findByText(/로그인 사용자:/);expect(screen.queryByText(/검색어: React/)).toBeNull();// 사용자 이벤트(userEvent) 입력을 대기awaituserEvent.type(screen.getByRole('textbox'),'React');expect(screen.getByText(/검색어: React/)).toBeInTheDocument(); });});
콜백 핸들러
때로는 React 앱이 아닌, 독립적으로 컴포넌트만 테스트 할 경우가 있습니다. 이런 경우 컴포넌트가 상태를 가지지 않고, 입력(props) 또는 출력(callback)만 있습니다. 콜백 핸들러 테스트 시, Jest 유틸리티를 사용할 수 있습니다.
fireEvent 예 (1회만 콜백 가능)
import Search from'./Search'describe('Search 컴포넌트 테스트', () => {test('onChange 콜백 핸들러를 호출합니다.', () => {// 콜백 핸들러constonChange=jest.fn()// 렌더링render(<Searchvalue=""onChange={onChange}>검색</Search>)// fireEvent를 사용해 <input />의 value를 업데이트 fireEvent.change(screen.getByRole('textbox'), { target: { value:'React 테스팅 라이브러리' } })// 콜백 핸들러 1회 호출된 것으로 어설션expect(onChange).toHaveBeenCalledTimes(1) })})
userEvent 예 (모든 키 입력에 대한 업데이트 콜백)
describe('Search 컴포넌트 테스트', () => {test('onChange 콜백 핸들러를 호출합니다.', () => {// 콜백 핸들러constonChange=jest.fn()// 렌더링render(<Searchvalue=""onChange={onChange}>검색</Search>)// userEvent를 사용해 <input />의 value 업데이트 대기awaituserEvent.type(screen.getByRole('textbox'),'React 테스팅 라이브러리')// 콜백 핸들러 1회 호출된 것으로 어설션expect(onChange).toHaveBeenCalledTimes(10) })})
비동기 테스트
앞서 asyncawait를 사용해 비동기 테스트 방식에 대해 살펴본 바 있습니다. findBy 검색 함수를 사용해 대기 상태에서 대상을 찾는 방법도 살펴봤죠. 이번에는 React에서 데이터를 가져오는(fetch) 테스트 예시를 살펴봅니다. Hacker News API에 데이터를 axios를 사용해 비동기 요청하는 React 컴포넌트 코드를 작성합니다.