Skip to content

TypeScript Jest @React testing library로 간단한 테스트해보기

문건우 edited this page Dec 17, 2020 · 1 revision

React Testing Library

React Testing Library는 Behavior Driven Test(행위 주도 테스트) 방법론이 대두 되면서 함께 주목 받기 시작한 테스팅 라이브러리. 기존의 관행이던 Implementation Driven Test(구현 주도 테스트)의 단점을 보완하기 위한 방법론.

구현 주도 테스트는 주로 애플리케이션이 어떻게 작동하는지에 대해서 테스트.

반면에 행위 주도 테스트는 사용자가 애플리케이션을 이용하는 관점에서 사용자의 실제 경험을 위주로 테스트. 사용자 입장에서 .. 사용자에게 어떤 컨텐츠가 보이고, 어떤 이벤트를 발생시켰을 대 그에 따라 화면에 변화가 일어나는지를 테스트.

Enzyme vs React Testing Library

Enzyme은 구현 주도 테스트를 따르는 테스트를 작성하기에 적합. 실제 브라우저 DOM이 아닌 React가 만들어내는 가상 dom을 기준으로 테스트를 작성. 따라서 테스트 대상 React 컴포넌트에 어떤 prop이 넘어가고, 현재 state가 어떻게 되는지에 대해서 검증하기에 용이

React-testing Library는 행위 주도 테스트를 따르는데 적합. jsdom을 통해 실제 브라우저 DOM을 기준으로 테스트를 작성. 따라서 어떤 React 컴포넌트를 사용하는지는 의미가 없으며, 결국 사용자 브라우저에서 렌더링하는 실제 html의 마크업의 모습이 어떤지에 대해서 테스트하기 용이

관련 라이브러리 설치

TypeScript + Jest로 테스트하기 위해서 설치해야할 것이 많다.

@testing-library/jest-dom: https://github.com/testing-library/jest-dom

@testing-library/react : https://github.com/testing-library/react-testing-library render, fireEvent, screen 등의 테스트 관련 함수 사용.

@testing-library/user-event: https://github.com/testing-library/user-event (클릭, 엔터 등등의 이벤트를 발생시킬 수 있다.)

https://testing-library.com/docs/ecosystem-user-event/ user-event와 react의 fireEvent 차이

https://testing-library.com/docs/dom-testing-library/api-events/

대부분의 프로젝트에는 fireEvent에 대한 몇 가지 사용 사례가 있지만 대부분의 경우 @ testing-library / user-event를 사용해야합니다 라고 적혀있다.

"@types/jest"

"jest",

"ts-jest",

Jest는 JavaScript로 작성 되었기 때문에 TypeScript에서 타입 정보를 알 수 없다. 그래서 jest의 타입정보를 가지고 있는 @types/jset를 설치해야주어야 한다. 그리고 jest에서 TypeScript를 실행하기 위해서 ts-jest를 설치한다.

그리고 package.json에 다음을 추가해주었다.

해당 내용은 jest.config.js 같은 파일에 따로 작성해도 된다.

"jest": {

"transform": {

".(ts|tsx)": "/node_modules/ts-jest/preprocessor.js"

},

"testRegex": "(/tests/.*|\.(test|spec))\.(ts|tsx|js)$",

"moduleFileExtensions": [

"ts",

"tsx",

"js"

],

}

scripts 부분에는 다음을 추가해주었다.

"test": "jest --forceExit --detectOpenHandles",

forceExit은 테스트가 끝나면 강제 종료, detectOpenHandles 는 열려있는 리소스를 모두 닫아준다.

components/ButtonItem.tsx

import React from 'react';

interface ButtonItemProps {
  title? string;
	handler?: () => void
}

function ButtonItem({ title, handler }: ButtonItemProps) {
  return (
    <button onClick={handler} >
      {title}
    </button>
  );
}

export default ButtonItem;

tests/ButtonItem.test.tsx

import * as React from 'react';
import { render } from '@testing-library/react';
import '@testing-library/jest-dom';
import ButtonItem from '../components/ButtonItem';

describe('Buttomitem TEST', () => {
  test('Buttomitem Rendering TEST ', () => {
    const { container } = render(<ButtonItem title={'제목'} handler={() => {}} />);

    expect(container).toHaveTextContent('제목'); // Dom안에 '제목'이라는 Text가 있는지 확인
    expect(container).not.toBeEmptyDOMElement(); // 빈 Dom이 아닌지 확인 등의 테스트를 할 수 있다.
  });
});

참고

https://www.daleseo.com/react-testing-library/

💒 Home

Home

📆 Planning

📋 요구 사항

📑 프로젝트 설계

📓 Api 명세서

📖 제품 백로그

📺 화면 기획서

📽️ Project

📖 도움말

📷 실행 화면

⚒️ 기술 스택

⚙️ 기술 특장점

✔️ Team Rule

그라운드 룰

☑️ 깃허브 사용 규칙

코딩 컨벤션 규칙

📝 Progress

🌿 1주차 Progress
☘️ 2주차 Progress
🍀 3주차 Progress
🍁 4주차 Progress
🌲 5주차 Progress

📚 학습 정리 공유

🛠️ 기술 관련 공유

Clone this wiki locally