본문 바로가기
Testing/Vitest

Vitest: Fire Event와 User Event 라이브러리에 대해 알아보자

by 코딩쥐 2024. 9. 23.

Fire Event

testing-library/react에 DOM요소에서 이벤트를 시뮬레이션하여 테스트할 수 있게 해주는 fireEvent가 있다. fireEvent의 경우에는 클릭, 입력, 포커스 등의 간단한 이벤트를 발생시켜 컴포넌트 동작을 테스트할 수 있다. 하지만 fireEvent의 경우 복잡한 상호작용을 시행하는 데에는 제한이 있어 User Event 라이브러리를 사용한다. 

 

Fire Event 사용하기

(1) @testing-library/react에서 fireEvent를 받아온다. 

import { fireEvent } from '@testing-library/react';

 

(2) fireEvent.이벤트(이벤트를 시행할 대상)으로 이벤트를 발생시킨다. 

    // 버튼 클릭 이벤트 발생
    fireEvent.click(button);
메서드 설명
mouseOver() 마우스 포인터를 특정 요소 위에 올린다.
mouseMove() 마우스 포인터가 특정 요소 위를 지나가거나 이동한다.
mouseDown() 마우스 버튼을 누른다.
focus() 요소에 포커스를 이동시킨다.
mouseUp() 마우스버튼에서 손을 뗀다.
click() 요소를 클릭한다.

 

<<전체 예제>>

더보기
//Comp1.jsx
import { useState } from 'react';

export default function Comp1(){
    const [text, setText] = useState("코딩쥐");
    const handleClick = () => {
        setText("codingji");
    }
    return(
        <div>
            <p>{text}</p>
            <button onClick={handleClick}>변경</button>
        </div>
    );
}

 

//Comp1.test.jsx
import { render, screen, fireEvent } from '@testing-library/react';
import Comp1 from './Comp1';

test('버튼 클릭 시 텍스트가 변경된다.', () => {
    render(<Comp1 />);

    const button = screen.getByRole('button', { name:/변경/i });
    const textElement = screen.getByText(/코딩쥐/i);

    // 초기 상태 확인
    expect(textElement).toBeInTheDocument();

    // 버튼 클릭 이벤트 발생
    fireEvent.click(button);

    // 변경된 상태 확인
    expect(screen.getByText(/codingji/i)).toBeInTheDocument();
});

User Event

위에서 설명했다시피 복잡한 상호작용을 테스트하기 위해서 만들어진 라이브러리다. userEvent의 경우에는 이벤트가 promise, 즉 이벤트가 비동기로 처리되기 때문에 async와 await를 사용해야한다. 

 

User Event 사용하기

(1) userEvent 설치하기

npm -D install @testing-library/user-event

 

(2) @testing-library/user-event에서 userEvent를 받아온다. 

import userEvent from "@testing-library/user-event"

 

(3) userEvent.이벤트(이벤트를 시행할 대상)으로 이벤트를 발생시킨다.  async/await를 사용하여 동기적으로 처리한다.

//Comp1.test.jsx
import { render, screen } from '@testing-library/react';
import { userEvent } from '@testing-library/user-event';
import Comp1 from './Comp1';

test('버튼 클릭 시 텍스트가 변경된다.', async () => {
    render(<Comp1 />);

    const button = screen.getByRole('button', { name:/변경/i });
    const textElement = screen.getByText(/코딩쥐/i);
    // 클릭했을 때 텍스트가 "codingji"로 변경된다.  
    await userEvent.click(button);
    expect(textElement).toHaveTextContent(/codingji/i);
});

 

예제에서는 userEvent를 한개만 작성하였지만 여러 개의 이벤트를 await를 통해서 순서대로 발생할 수 있다. 예를 들어서 버튼을 클릭하고, 요소 위에 마우스를 올리고 엔터를 입력하는 이벤트를 시행하고 싶으면 아래처럼 작성하면 된다. 

test('버튼 클릭 시 텍스트가 변경된다.', async () => {
    render(<Comp1 />);
    const button = screen.getByRole('button', { name:/변경/i });
    const textElement = screen.getByText(/코딩쥐/i);
    
    await userEvent.click(button);
    await userEvent.hover(textElement);
    await userEvent.keyboard('{Enter}');
    
    expect(textElement).toHaveTextContent(/codingji/i);
});

 

메서드 설명
click() 요소를 클릭한다.
type() 입력 필드에 텍스트를 입력한다.
dblClick() 요소를 더블 클릭한다.
selectOptions() 드롭다운에서 옵션을 선택한다.
deselectOptions() 드롭다운에서 선택된 옵션을 해제한다.
upload() 파일을 업로드한다.
clear() 입력 필드의 내용을 지운다.
hover() 요소 위에 마우스를 올린다.
unhover() 요소에서 마우스를 내린다.
tab() 탭 키를 눌러 포커스를 이동한다.
keyboard() 키보드 입력을 시뮬레이션한다. 

 

'Testing > Vitest' 카테고리의 다른 글

Vitest : testing-library/jest-dom에 대해서  (0) 2024.09.23
Vitest : Query function (쿼리함수)에 대해서  (1) 2024.09.22
Vitest 사용하기  (0) 2024.09.22