이벤트 테스트
fireEvent 테스트
검색 함수, 어설션 함수와 달리, 사용자와의 인터랙션 테스트에서 사용되는 것이 fireEvent 입니다. fireEvent를 사용하면 사용자의 인터랙션 시뮬레이션 테스트를 수행할 수 있습니다.
import { render, screen, fireEvent } from '@testing-library/react'
import App from './App'
describe('App', () => {
test('App 컴포넌트 렌더링', () => {
render(<App />);
// 사용자 인터랙션 시뮬레이션 테스트
fireEvent.change(
// 스크린에서 textbox 역할 요소를 가져와
screen.getByRole('textbox'), {
// 이벤트 대상 값을 'React 테스팅 라이브러리'로 변경합니다.
target: { value: 'React 테스팅 라이브러리' }
}
)
})
})이벤트 전/후 screen.debug()를 출력해 업데이트 된 UI 코드를 비교해볼 수도 있습니다.
로그인 이후 또는 이벤트를 통한 UI 업데이트 이후, 대상을 찾아 UI에 존재하는지 또는 문서에 포함되어 있는지 테스트를 수행할 수 있습니다.
userEvent 테스트
RTL은 fireEvent 외에도 userEvent를 사용한 테스트를 제공합니다. userEvent가 실제 브라우저의 인터랙션에 근접한 방식으로 fireEvent를 대체하여 사용할 수 있습니다. 가능하다면 userEvent를 사용하는 것을 권장합니다. 단, 현 시점에서는 userEvent가 fireEvent의 모든 기능을 대체할 수 없으니 사용에 주의가 필요합니다.
콜백 핸들러
때로는 React 앱이 아닌, 독립적으로 컴포넌트만 테스트 할 경우가 있습니다. 이런 경우 컴포넌트가 상태를 가지지 않고, 입력(props) 또는 출력(callback)만 있습니다. 콜백 핸들러 테스트 시, Jest 유틸리티를 사용할 수 있습니다.
fireEvent 예 (1회만 콜백 가능)
userEvent 예 (모든 키 입력에 대한 업데이트 콜백)
비동기 테스트
앞서 async await를 사용해 비동기 테스트 방식에 대해 살펴본 바 있습니다. findBy 검색 함수를 사용해 대기 상태에서 대상을 찾는 방법도 살펴봤죠. 이번에는 React에서 데이터를 가져오는(fetch) 테스트 예시를 살펴봅니다. Hacker News API에 데이터를 axios를 사용해 비동기 요청하는 React 컴포넌트 코드를 작성합니다.
App 컴포넌트 테스트 파일 코드는 다음과 같습니다. App 컴포넌트를 렌더링하기 전에 axios를 목업해야 합니다.
데이터 비동기 요청 실패 시뮬레이션 테스트는 다음과 같이 수행합니다.
마지막 테스트는 보다 명확한 방식으로 Promise를 기다리는 방법을 보여 주며, HTML이 표시 되기를 기다리지 않는 경우에도 효과적입니다.
결론은 RTL을 사용해 React의 비동기 액션을 테스트하는 것은 그리 어렵지 않습니다. Jest를 사용해 외부 모듈을 목업한 후, 테스트에서 React 컴포넌트의 데이터를 기다리거나 다시 렌더링합니다.
Last updated
Was this helpful?