Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings
Open more actions menu
ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

263 Commits
263 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

user-event

dog

Simulate user events for react-testing-library.



Build Status Maintainability Test Coverage All Contributors

The problem

From testing-library/dom-testing-library#107:

[...] it is becoming apparent the need to express user actions on a web page using a higher-level abstraction than fireEvent

The solution

user-event tries to simulate the real events that would happen in the browser as the user interacts with it. For example userEvent.click(checkbox) would change the state of the checkbox.

The library is still a work in progress and any help is appreciated.

Installation

With NPM:

npm install @testing-library/user-event --save-dev

With Yarn:

yarn add @testing-library/user-event --dev

Now simply import it in your tests:

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

// or

var userEvent = require("@testing-library/user-event");

API

click(element)

Clicks element, depending on what element is it can have different side effects.

import React from "react";
import { render } from "@testing-library/react";
import userEvent from "@testing-library/user-event";

test("click", () => {
  const { getByText, getByTestId } = render(
    <div>
      <label htmlFor="checkbox">Check</label>
      <input id="checkbox" data-testid="checkbox" type="checkbox" />
    </div>
  );

  userEvent.click(getByText("Check"));
  expect(getByTestId("checkbox")).toHaveAttribute("checked", true);
});

dblClick(element)

Clicks element twice, depending on what element is it can have different side effects.

import React from "react";
import { render } from "@testing-library/react";
import userEvent from "@testing-library/user-event";

test("double click", () => {
  const onChange = jest.fn();
  const { getByTestId } = render(
    <input type="checkbox" id="checkbox" onChange={onChange} />
  );
  const checkbox = getByTestId("checkbox");
  userEvent.dblClick(checkbox);
  expect(onChange).toHaveBeenCalledTimes(2);
  expect(checkbox).toHaveProperty("checked", false);
});

type(element, text, [options])

Writes text inside an <input> or a <textarea>.

import React from "react";
import { render } from "@testing-library/react";
import userEvent from "@testing-library/user-event";

const { getByTestId } = test("click", () => {
  render(<textarea data-testid="email" />);
});

userEvent.type(getByTestId("email"), "Hello, World!");
expect(getByTestId("email")).toHaveAttribute("value", "Hello, World!");

If options.allAtOnce is true, type will write text at once rather than one character at the time. false is the default value.

options.delay is the number of milliseconds that pass between two characters are typed. By default it's 0. You can use this option if your component has a different behavior for fast or slow users.

selectOptions(element, values)

Selects the specified option(s) of a <select> or a <select multiple> element.

import React from "react";
import { render } from "@testing-library/react";
import userEvent from "@testing-library/user-event";

const { getByTestId } = render(
  <select multiple data-testid="select-multiple">
    <option data-testid="val1" value="1">
      1
    </option>
    <option data-testid="val2" value="2">
      2
    </option>
    <option data-testid="val3" value="3">
      3
    </option>
  </select>
);

userEvent.selectOptions(getByTestId("select-multiple"), ["1", "3"]);

expect(getByTestId("val1").selected).toBe(true);
expect(getByTestId("val2").selected).toBe(false);
expect(getByTestId("val3").selected).toBe(true);

The values parameter can be either an array of values or a singular scalar value.

Contributors

Thanks goes to these wonderful people (emoji key):

Giorgio Polvara
Giorgio Polvara

๐Ÿ› ๐Ÿ’ป ๐Ÿ“– ๐Ÿค” ๐Ÿš‡ ๐Ÿ‘€ โš ๏ธ
Weyert de Boer
Weyert de Boer

๐Ÿ’ป โš ๏ธ
Tim Whitbeck
Tim Whitbeck

๐Ÿ› ๐Ÿ’ป
Michaรซl De Boey
Michaรซl De Boey

๐Ÿ“–
Michael Lasky
Michael Lasky

๐Ÿ’ป ๐Ÿ“– ๐Ÿค”
Ahmad Esmaeilzadeh
Ahmad Esmaeilzadeh

๐Ÿ“–
Caleb Eby
Caleb Eby

๐Ÿ’ป ๐Ÿ›
Adriร  Fontcuberta
Adriร  Fontcuberta

๐Ÿ› โš ๏ธ ๐Ÿ’ป
Sky Wickenden
Sky Wickenden

๐Ÿ› ๐Ÿ’ป
Bodnar Bogdan
Bodnar Bogdan

๐Ÿ› ๐Ÿ’ป
Zach Perrault
Zach Perrault

๐Ÿ“–
Ryan Stelly
Ryan Stelly

๐Ÿ“–
Ben Monro
Ben Monro

๐Ÿ’ป

This project follows the all-contributors specification. Contributions of any kind welcome!

About

๐Ÿ• Simulate user events for react-testing-library

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages

Morty Proxy This is a proxified and sanitized view of the page, visit original site.