arrow-left

All pages
gitbookPowered by GitBook
1 of 1

Loading...

Test Utilities

Importing

hashtag
Overview

ReactTestUtils makes it easy to test React components in the testing framework of your choice. At Facebook we use Jestarrow-up-right for painless JavaScript testing. Learn how to get started with Jest through the Jest website's React Tutorialarrow-up-right.

Note:

We recommend using which is designed to enable and encourage writing tests that use your components as the end users do.

For React versions <= 16, the library makes it easy to assert, manipulate, and traverse your React Components' output.

hashtag
Reference

hashtag
act()

To prepare a component for assertions, wrap the code rendering it and performing updates inside an act() call. This makes your test run closer to how React works in the browser.

Note

If you use react-test-renderer, it also provides an act export that behaves the same way.

For example, let's say we have this Counter component:

Here is how we can test it:

  • Don't forget that dispatching DOM events only works when the DOM container is added to the document. You can use a library like to reduce the boilerplate code.

  • The recipes document contains more details on how act() behaves, with examples and usage.


hashtag
mockComponent()

Pass a mocked component module to this method to augment it with useful methods that allow it to be used as a dummy React component. Instead of rendering as usual, the component will become a simple <div> (or other tag if mockTagName is provided) containing any provided children.

Note:

mockComponent() is a legacy API. We recommend using instead.


hashtag
isElement()

Returns true if element is any React element.


hashtag
isElementOfType()

Returns true if element is a React element whose type is of a React componentClass.


hashtag
isDOMComponent()

Returns true if instance is a DOM component (such as a <div> or <span>).


hashtag
isCompositeComponent()

Returns true if instance is a user-defined component, such as a class or a function.


hashtag
isCompositeComponentWithType()

Returns true if instance is a component whose type is of a React componentClass.


hashtag
findAllInRenderedTree()

Traverse all components in tree and accumulate all components where test(component) is true. This is not that useful on its own, but it's used as a primitive for other test utils.


hashtag
scryRenderedDOMComponentsWithClass()

Finds all DOM elements of components in the rendered tree that are DOM components with the class name matching className.


hashtag
findRenderedDOMComponentWithClass()

Like but expects there to be one result, and returns that one result, or throws exception if there is any other number of matches besides one.


hashtag
scryRenderedDOMComponentsWithTag()

Finds all DOM elements of components in the rendered tree that are DOM components with the tag name matching tagName.


hashtag
findRenderedDOMComponentWithTag()

Like but expects there to be one result, and returns that one result, or throws exception if there is any other number of matches besides one.


hashtag
scryRenderedComponentsWithType()

Finds all instances of components with type equal to componentClass.


hashtag
findRenderedComponentWithType()

Same as but expects there to be one result and returns that one result, or throws exception if there is any other number of matches besides one.


hashtag
renderIntoDocument()

Render a React element into a detached DOM node in the document. This function requires a DOM. It is effectively equivalent to:

Note:

You will need to have window, window.document and window.document.createElement globally available before you import React. Otherwise React will think it can't access the DOM and methods like setState won't work.


hashtag
Other Utilities

hashtag
Simulate

Simulate an event dispatch on a DOM node with optional eventData event data.

Simulate has a method for every event that React understands.

Clicking an element

Changing the value of an input field and then pressing ENTER.

Note

You will have to provide any event property that you're using in your component (e.g. keyCode, which, etc...) as React is not creating any of these for you.


import ReactTestUtils from "react-dom/test-utils"; // ES6
var ReactTestUtils = require("react-dom/test-utils"); // ES5 with npm
  • React Testing Libraryarrow-up-right
    Enzymearrow-up-right
    act()arrow-up-right
    mockComponent()arrow-up-right
    isElement()arrow-up-right
    React Testing Libraryarrow-up-right
    jest.mock()arrow-up-right
    scryRenderedDOMComponentsWithClass()arrow-up-right
    scryRenderedDOMComponentsWithTag()arrow-up-right
    scryRenderedComponentsWithType()arrow-up-right
    class Counter extends React.Component {
      constructor(props) {
        super(props);
        this.state = { count: 0 };
        this.handleClick = this.handleClick.bind(this);
      }
      componentDidMount() {
        document.title = `You clicked ${this.state.count} times`;
      }
      componentDidUpdate() {
        document.title = `You clicked ${this.state.count} times`;
      }
      handleClick() {
        this.setState((state) => ({
          count: state.count + 1,
        }));
      }
      render() {
        return (
          <div>
            <p>You clicked {this.state.count} times</p>
            <button onClick={this.handleClick}>Click me</button>
          </div>
        );
      }
    }
    import React from 'react';
    import ReactDOM from 'react-dom';
    import { act } from 'react-dom/test-utils';
    import Counter from './Counter';
    
    let container;
    
    beforeEach(() => {
      container = document.createElement('div');
      document.body.appendChild(container);
    });
    
    afterEach(() => {
      document.body.removeChild(container);
      container = null;
    });
    
    it('can render and update a counter', () => {
      // Test first render and componentDidMount
      act(() => {
        ReactDOM.render(<Counter />, container);
      });
      const button = container.querySelector('button');
      const label = container.querySelector('p');
      expect(label.textContent).toBe('You clicked 0 times');
      expect(document.title).toBe('You clicked 0 times');
    
      // Test second render and componentDidUpdate
      act(() => {
        button.dispatchEvent(new MouseEvent('click', {bubbles: true}));
      });
      expect(label.textContent).toBe('You clicked 1 times');
      expect(document.title).toBe('You clicked 1 times');
    });
    mockComponent(componentClass, [mockTagName]);
    isElement(element);
    isElementOfType(element, componentClass);
    isDOMComponent(instance);
    isCompositeComponent(instance);
    isCompositeComponentWithType(instance, componentClass);
    findAllInRenderedTree(tree, test);
    scryRenderedDOMComponentsWithClass(tree, className);
    findRenderedDOMComponentWithClass(tree, className);
    scryRenderedDOMComponentsWithTag(tree, tagName);
    findRenderedDOMComponentWithTag(tree, tagName);
    scryRenderedComponentsWithType(tree, componentClass);
    findRenderedComponentWithType(tree, componentClass);
    renderIntoDocument(element);
    const domContainer = document.createElement("div");
    ReactDOM.render(element, domContainer);
    Simulate.{eventName}(
      element,
      [eventData]
    )
    // <button ref={(node) => this.button = node}>...</button>
    const node = this.button;
    ReactTestUtils.Simulate.click(node);
    // <input ref={(node) => this.textInput = node} />
    const node = this.textInput;
    node.value = "giraffe";
    ReactTestUtils.Simulate.change(node);
    ReactTestUtils.Simulate.keyDown(node, { key: "Enter", keyCode: 13, which: 13 });
    isElementOfType()arrow-up-right
    isDOMComponent()arrow-up-right
    isCompositeComponent()arrow-up-right
    isCompositeComponentWithType()arrow-up-right
    findAllInRenderedTree()arrow-up-right
    scryRenderedDOMComponentsWithClass()arrow-up-right
    findRenderedDOMComponentWithClass()arrow-up-right
    scryRenderedDOMComponentsWithTag()arrow-up-right
    findRenderedDOMComponentWithTag()arrow-up-right
    scryRenderedComponentsWithType()arrow-up-right
    findRenderedComponentWithType()arrow-up-right
    renderIntoDocument()arrow-up-right
    Simulatearrow-up-right