글 작성자: 망고좋아
반응형

📖 오늘 배운 내용 - 2022.01.15

  • React 테스팅
  • jest
  • react-testing-library

 

📝 React 테스팅

 

[React] React 테스팅

🎯 React 테스팅 📝 코드 테스트가 필요한 경우 코드를 작성하고 나면, 원하는 대로 동작하는지 알기 위해 코드에 버그가 있으면, 어떤 상황에서 버그가 발생하는지를 알기 위해 코드를 리팩토

lakelouise.tistory.com

 

📝 jest

 

[jest] jest란?

🎯 jest facebook에서 오픈소스화한 테스팅 프레임워크 assertion 함수들, test runner, mock 라이브러리 등을 모두 제공한다. create-react-app에서 기본적으로 사용된다. (npm test) 사용성이 좋고, 가장 인기..

lakelouise.tistory.com

 

📝 Assertion Matchers 활용

 

[Jest] Assertion Matchers 활용

🎯 Assertion Matchers 활용 toBe() : 객체의 내용을 비교 toEqual() : 객체 자체를 비교할 toContain() toMatch() toThrow() function isPythagorean(a, b, c) { return a * a + b * b === c * c } function cre..

lakelouise.tistory.com

 

📝 Async assertion

 

[Jest] Async assertion

🎯 Async assertion callback 패턴의 경우 test() 함수가 제공하는 done() 함수를 활용하여 콜백이 끝나고 done()을 호출이 된다. 에러가 발생하면 done()의 인자로 에러를 넘긴다. Promise 패턴의 경우 async/aw..

lakelouise.tistory.com

 

📝 react-testing-library

 

[react-testing-library] react-testing-library란?

🎯 react-testing-library 테스트가 소프트웨어가 사용되는 모습을 닮을수록, 테스트를 더욱 신뢰할 수 있게 된다. The more your tests resemble the way your software is used, the more confidence they can..

lakelouise.tistory.com

 

📝 쿼리의 우선순위

 

[react-testing-library] 쿼리의 우선순위

🎯 쿼리의 우선순위 유저가 페이지를 이동하는 방식에 가까운 쿼리일수록 우선순위가 높다. 접근성 높은 HTML을 작성할수록 테스트가 용이한 코드가 된다. 📝 ByRole (제일 높음) accessibility tree에

lakelouise.tistory.com

 

📝 유저 이벤트

 

[react-testing-library] 유저 이벤트

🎯 유저 이벤트 📝 user-event 내장 이벤트 함수인 fireEvent, createEvent를 좀 더 직관적이고 범용적으로 사용할 수 있도록 만든 라이브러리 click, type, keyboard, upload, hover, tab 등 유저가 실제로 웹페..

lakelouise.tistory.com

 

📝 예제

🛠 App.js

import React, { useState } from "react";

function SimpleToggle() {
  const [show, setShow] = useState(false)

  const handleClick = () => setShow(b => !b)

  return (
    <div>
      {!show && <div>유저 정보를 보려면 버튼을 누르세요.</div>}
      {show && (
        <ul>
          <li>Email - test@test.com</li>
          <li>Address - 서울시 </li>
        </ul>
      )}
      <button onClick={handleClick}>
       {!show ? "유저정보 보기 " : "유저정보 가리기"}
      </button>
    </div>

  )
}

export default SimpleToggle;

 

🛠 App.test.js

import { screen, render } from "@testing-library/react";
import userEvent from '@testing-library/user-event';
import SimpleToggle from "./App";

describe("앱을 렌더링합니다.", () => {
  test("버튼이 있습니다.", () => {
    render(<SimpleToggle />);
    const button = screen.getByRole('button', {
      name: '유저정보 보기'
    })
    expect(button).toBeInTheDocument()
  });

  test("버튼을 누르지 않았을 시, 유저 정보 안내문이 보입니다.", () => {
    render(<SimpleToggle />);
    const text = screen.getByText('유저 정보를 보려면 버튼을 누르세요.')
    expect(text).toBeInTheDocument()
  });
});

describe("토글 기능을 테스트합니다.", () => {
  test("버튼을 눌렀을 시, 유저 정보가 보입니다.", () => {
    render(<SimpleToggle />);
    const infoText = /유저 정보를 보려면 버튼을 누르세요./i

    const text = screen.getByText(infoText)
    expect(text).toBeInTheDocument()

    const button = screen.getByRole('button', {
      name: '유저정보 보기'
    })
    userEvent.click(button) // 버튼을 클릭
    expect(
      screen.queryByText(infoText)
    ).not.toBeInTheDocument() // 위에서 찾은 텍스트가 보이지 않는지 체크

    const email = screen.getByText('Email - elice@elicer.com')
    expect(email).toBeInTheDocument()

    const address = screen.getByText('Address - 서울시 강남구 테헤란로 401')
    expect(address).toBeInTheDocument()

    expect(button).toHaveTextContent('유저정보 가리기')
  });

  test("버튼을 두번 누르면, 유저 정보가 보이지 않습니다.", () => {
    render(<SimpleToggle />);

    const button = screen.getByRole('button', {
      name: '유저정보 보기'
    })

    userEvent.click(button, { clickCount: 1}) // 버튼 카운트를 명시할 수 있다. 한번만 누른 경우!
    const email = screen.getByText("Email - elice@elicer.com")
    expect(email).toBeInTheDocument()

    userEvent.click(button, { clickCount: 1})
    expect(email).not.toBeInTheDocument()
  });
});

 

📕 1 단계

  • 유저 정보 보기" 버튼을 찾기
    • const button = screen.getByRole('button', { name: '유저정보 보기' })
  • 버튼이 존재하는지 체크
    • expect(button).toBeInTheDocument()
  • 코드 작성
  • function SimpleToggle() { return ( <button>유저정보 보기</button> ) }

 

📕 2단계

  • 텍스트를 찾기
    • const text = screen.getByText('유저 정보를 보려면 버튼을 누르세요.');
  • 텍스트가 존재하는지 체크
    • expect(text).toBeInTheDocument()

 

📕 그 후

  • userEvent.click(button)
  • expect(
          screen.queryByText(infoText)
    ).not.toBeInTheDocument() // 위에서 찾은 텍스트가 보이지 않는지 체크

 

💡 오늘 깨달은 것

  • 테스트 코드 뭔가 재밌다.
  • 초반 생산성은 떨어질 수 있지만 견고한 코드를 작성할 수 있을 거 같다.
반응형