We want to hear from you!Take our 2021 Community Survey!
ใ“ใฎใ‚ตใ‚คใƒˆใฎๆ›ดๆ–ฐใฏ็ต‚ไบ†ใ—ใพใ—ใŸใ€‚ja.react.dev ใธ

ใƒ†ใ‚นใƒˆใƒฆใƒผใƒ†ใ‚ฃใƒชใƒ†ใ‚ฃ

ใ‚คใƒณใƒใƒผใƒˆ

import ReactTestUtils from 'react-dom/test-utils'; // ES6
var ReactTestUtils = require('react-dom/test-utils'); // ES5 with npm

ๆฆ‚่ฆ

ReactTestUtils ใฏใŠๅฅฝใฟใฎใƒ†ใ‚นใƒˆใƒ•ใƒฌใƒผใƒ ใƒฏใƒผใ‚ฏใง React ใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใ‚’ใƒ†ใ‚นใƒˆใ—ใ‚„ใ™ใใ™ใ‚‹ใ‚‚ใฎใงใ™ใ€‚Facebook ใงใฏๅฟซ้ฉใซ JavaScript ใ‚’ใƒ†ใ‚นใƒˆใ™ใ‚‹ใŸใ‚ใซ Jest ใ‚’ไฝฟ็”จใ—ใฆใ„ใพใ™ใ€‚Jest ใฎใ‚ฆใ‚งใƒ–ใ‚ตใ‚คใƒˆใซใ‚ใ‚‹ React Tutorial ใ‚’้€šใ—ใฆ Jest ใฎๅง‹ใ‚ๆ–นใ‚’ๅญฆใ‚“ใงใใ ใ•ใ„ใ€‚

่ฃœ่ถณ:

react-testing-library ใฎไฝฟ็”จใ‚’ใŠใ™ใ™ใ‚ใ—ใพใ™ใ€‚ใ“ใ‚Œใฏใ€ใ‚จใƒณใƒ‰ใƒฆใƒผใ‚ถใŒใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใ‚’ไฝฟ็”จใ™ใ‚‹ใจใใจๅŒๆง˜ใฎๆ–นๆณ•ใงใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใ‚’ไฝฟ็”จใ™ใ‚‹ใ‚ˆใ†ใชใƒ†ใ‚นใƒˆใ‚’ๆ›ธใใ“ใจใ‚’ๅฏ่ƒฝใซใ—ใ€ใ‹ใคใใ‚Œใ‚’ไฟƒ้€ฒใ™ใ‚‹ใ‚ˆใ†ใซ่จญ่จˆใ•ใ‚Œใฆใ„ใพใ™ใ€‚

ใƒใƒผใ‚ธใƒงใƒณ 16 ไปฅไธ‹ใฎ React ใ‚’ไฝฟ็”จใ—ใฆใ„ใ‚‹ๅ ดๅˆใ€Enzyme ใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’ไฝฟใ†ใ“ใจใง React ใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใฎๅ‡บๅŠ›ใฎใ‚ขใ‚ตใƒผใƒˆใ€ๆ“ไฝœใ€ใใ—ใฆๆจชๆ–ญ็š„ใชๅ‡ฆ็†ใ‚’็ฐกๅ˜ใซ่กŒใˆใพใ™ใ€‚

Reference

act()

ใ‚ขใ‚ตใƒผใ‚ทใƒงใƒณ็”จใฎใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใ‚’ๆบ–ๅ‚™ใ™ใ‚‹ใŸใ‚ใซใ€ใใ‚Œใ‚’ใƒฌใƒณใƒ€ใƒผใ—ใฆๆ›ดๆ–ฐใ‚’ๅฎŸ่กŒใ™ใ‚‹ใ‚ณใƒผใƒ‰ใ‚’ act() ใงใƒฉใƒƒใƒ—ใ—ใพใ™ใ€‚ใ“ใ‚Œใซใ‚ˆใ‚Šใ€ใƒ†ใ‚นใƒˆใฏใƒ–ใƒฉใ‚ฆใ‚ถใงใฎ React ใฎๅ‹•ไฝœใซใ‚ˆใ‚Š่ฟ‘ใ„็Šถๆ…‹ใงๅฎŸ่กŒใ•ใ‚Œใพใ™ใ€‚

่ฃœ่ถณ

react-test-renderer ใ‚’ไฝฟใฃใฆใ„ใ‚‹ๅ ดๅˆใ€ใใ‚Œใฏใ“ใฎใƒกใ‚ฝใƒƒใƒ‰ใจๅŒใ˜ใ‚ˆใ†ใซๆŒฏ่ˆžใ† act ใ‚จใ‚ฏใ‚นใƒใƒผใƒˆใ‚‚ๆไพ›ใ—ใพใ™ใ€‚

ไพ‹ใˆใฐใ€ๆฌกใฎใ‚ˆใ†ใช Counter ใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใŒใ‚ใ‚‹ใจใ—ใพใ—ใ‚‡ใ†๏ผš

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/client';
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.createRoot(container).render(<Counter />);  });  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');
});
  • DOM ใ‚คใƒ™ใƒณใƒˆใฎใƒ‡ใ‚ฃใ‚นใƒ‘ใƒƒใƒใฏใ€DOM ใ‚ณใƒณใƒ†ใƒŠใŒ document ใซ่ฟฝๅŠ ใ•ใ‚ŒใŸใจใใ ใ‘ๅ‹•ไฝœใ™ใ‚‹ใ“ใจใ‚’ๅฟ˜ใ‚Œใชใ„ใงใใ ใ•ใ„ใ€‚React Testing Library ใฎใ‚ˆใ†ใชใƒ˜ใƒซใƒ‘ใƒผใ‚’ไฝฟใˆใฐใƒœใ‚คใƒฉใƒผใƒ—ใƒฌใƒผใƒˆใฎใ‚ณใƒผใƒ‰ใ‚’ๆธ›ใ‚‰ใ›ใพใ™ใ€‚
  • recipes ใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใซใฏ act() ใŒใฉใฎใ‚ˆใ†ใซๅ‹•ไฝœใ™ใ‚‹ใฎใ‹ใซใคใ„ใฆไพ‹ใ‚„ไฝฟ็”จๆณ•ใ‚’ไบคใˆใŸ่ฉณใ—ใ„่งฃ่ชฌใŒใ‚ใ‚Šใพใ™ใ€‚

mockComponent()

mockComponent(
  componentClass,
  [mockTagName]
)

ใƒขใƒƒใ‚ฏๅŒ–ใ•ใ‚ŒใŸใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใƒขใ‚ธใƒฅใƒผใƒซใ‚’ใ“ใฎใƒกใ‚ฝใƒƒใƒ‰ใซๆธกใ™ใ“ใจใงใ€ใƒ€ใƒŸใƒผใฎ React ใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใจใ—ใฆไฝฟ็”จใงใใ‚‹ใ‚ˆใ†ใซใชใ‚‹ไพฟๅˆฉใชใƒกใ‚ฝใƒƒใƒ‰ใ‚’่ฟฝๅŠ ใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚้€šๅธธใฎใƒฌใƒณใƒ€ใƒผใฎไปฃใ‚ใ‚Šใซใ€ใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใฏใ€ไธŽใˆใ‚‰ใ‚ŒใŸๅญ่ฆ็ด ใ‚’ๅซใ‚“ใ ใ‚ทใƒณใƒ—ใƒซใช <div>๏ผˆใ‚‚ใ—ใใฏ mockTagName ใŒไธŽใˆใ‚‰ใ‚Œใฆใ„ใ‚Œใฐไป–ใฎใ‚ฟใ‚ฐ๏ผ‰ใซใชใ‚Šใพใ™ใ€‚

่ฃœ่ถณ:

mockComponent() ใฏใƒฌใ‚ฌใ‚ทใƒผใช API ใงใ™ใ€‚ใใฎไปฃใ‚ใ‚Šใจใ—ใฆ jest.mock() ใฎไฝฟ็”จใ‚’ใŠใ™ใ™ใ‚ใ—ใพใ™ใ€‚


isElement()

isElement(element)

element ใŒไปปๆ„ใฎ React ่ฆ็ด ใงใ‚ใ‚‹ๅ ดๅˆ true ใ‚’่ฟ”ใ—ใพใ™ใ€‚


isElementOfType()

isElementOfType(
  element,
  componentClass
)

element ใŒ componentClass ๅž‹ใฎ React ่ฆ็ด ใงใ‚ใ‚‹ๅ ดๅˆ true ใ‚’่ฟ”ใ—ใพใ™ใ€‚


isDOMComponent()

isDOMComponent(instance)

instance ใŒ DOM ใ‚ณใƒณใƒใƒผใƒใƒณใƒˆ๏ผˆ<div> ใ‚„ <span> ใชใฉ๏ผ‰ใงใ‚ใ‚‹ๅ ดๅˆ true ใ‚’่ฟ”ใ—ใพใ™ใ€‚


isCompositeComponent()

isCompositeComponent(instance)

instance ใŒใ‚ฏใƒฉใ‚นใ‚„้–ขๆ•ฐใฎใ‚ˆใ†ใชใƒฆใƒผใ‚ถๅฎš็พฉใฎใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใงใ‚ใ‚‹ๅ ดๅˆ true ใ‚’่ฟ”ใ—ใพใ™ใ€‚


isCompositeComponentWithType()

isCompositeComponentWithType(
  instance,
  componentClass
)

instance ใŒ React ใฎ componentClass ๅž‹ใฎใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใงใ‚ใ‚‹ๅ ดๅˆ true ใ‚’่ฟ”ใ—ใพใ™ใ€‚


findAllInRenderedTree()

findAllInRenderedTree(
  tree,
  test
)

tree ไธญใฎใ™ในใฆใฎใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใ‚’ๆจชๆ–ญใ—ใฆ test(component) ใŒ true ใงใ‚ใ‚‹ๅ…จใฆใฎใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใ‚’้›†ใ‚ใ€ใใฎ็ตๆžœใ‚’่ฟ”ใ—ใพใ™ใ€‚ใ“ใฎใƒกใ‚ฝใƒƒใƒ‰่‡ช่บซใฏใใ‚Œใปใฉๆœ‰็”จใงใฏใ‚ใ‚Šใพใ›ใ‚“ใŒใ€ไป–ใฎใƒ†ใ‚นใƒˆใƒฆใƒผใƒ†ใ‚ฃใƒชใƒ†ใ‚ฃใฎใŸใ‚ใฎๅŸบๆœฌใƒกใ‚ฝใƒƒใƒ‰ใจใ—ใฆไฝฟ็”จใ•ใ‚Œใพใ™ใ€‚


scryRenderedDOMComponentsWithClass()

scryRenderedDOMComponentsWithClass(
  tree,
  className
)

ใƒฌใƒณใƒ€ใƒผใ•ใ‚ŒใŸใƒ„ใƒชใƒผๅ†…ใซๅญ˜ๅœจใ™ใ‚‹ใ€ใ‚ฏใƒฉใ‚นๅใŒ className ใซไธ€่‡ดใ™ใ‚‹ DOM ใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใŒๆŒใคๅ…จใฆใฎ DOM ่ฆ็ด ใ‚’ๆŽขใ—ใ€ใใฎ็ตๆžœใ‚’่ฟ”ใ—ใพใ™ใ€‚


findRenderedDOMComponentWithClass()

findRenderedDOMComponentWithClass(
  tree,
  className
)

scryRenderedDOMComponentsWithClass() ใจๅŒๆง˜ใฎใƒกใ‚ฝใƒƒใƒ‰ใงใ™ใŒใ€ใ“ใฎใƒกใ‚ฝใƒƒใƒ‰ใฏ็ตๆžœใŒ 1 ใคใ ใ‘ใงใ‚ใ‚‹ใ“ใจใ‚’ๆœŸๅพ…ใ—ใฆใŠใ‚Šใ€ใใฎ 1 ใคใฎ็ตๆžœใ‚’่ฟ”ใ™ใ‹ใ€ไธ€่‡ดใ™ใ‚‹ใ‚‚ใฎใŒ 1 ใคใงใชใ‹ใฃใŸๅ ดๅˆใซใฏไพ‹ๅค–ใ‚’ใ‚นใƒญใƒผใ—ใพใ™ใ€‚


scryRenderedDOMComponentsWithTag()

scryRenderedDOMComponentsWithTag(
  tree,
  tagName
)

ใƒฌใƒณใƒ€ใƒผใ•ใ‚ŒใŸใƒ„ใƒชใƒผๅ†…ใซๅญ˜ๅœจใ™ใ‚‹ใ€ใ‚ฟใ‚ฐๅใŒ tagName ใซไธ€่‡ดใ™ใ‚‹ DOM ใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใŒๆŒใคๅ…จใฆใฎ DOM ่ฆ็ด ใ‚’ๆŽขใ—ใ€ใใฎ็ตๆžœใ‚’่ฟ”ใ—ใพใ™ใ€‚


findRenderedDOMComponentWithTag()

findRenderedDOMComponentWithTag(
  tree,
  tagName
)

scryRenderedDOMComponentsWithTag() ใจๅŒๆง˜ใฎใƒกใ‚ฝใƒƒใƒ‰ใงใ™ใŒใ€ใ“ใฎใƒกใ‚ฝใƒƒใƒ‰ใฏ็ตๆžœใŒ 1 ใคใ ใ‘ใงใ‚ใ‚‹ใ“ใจใ‚’ๆœŸๅพ…ใ—ใฆใŠใ‚Šใ€ใใฎ 1 ใคใฎ็ตๆžœใ‚’่ฟ”ใ™ใ‹ใ€ไธ€่‡ดใ™ใ‚‹ใ‚‚ใฎใŒ 1 ใคใงใชใ‹ใฃใŸๅ ดๅˆใซใฏไพ‹ๅค–ใ‚’่ฟ”ใ—ใพใ™ใ€‚


scryRenderedComponentsWithType()

scryRenderedComponentsWithType(
  tree,
  componentClass
)

ๅž‹ใŒ componentClass ใจๅŒใ˜ใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใฎใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใ‚’ๅ…จใฆๆŽขใ—ใ€ใใฎ็ตๆžœใ‚’่ฟ”ใ—ใพใ™ใ€‚


findRenderedComponentWithType()

findRenderedComponentWithType(
  tree,
  componentClass
)

scryRenderedComponentsWithType() ใจๅŒๆง˜ใฎใƒกใ‚ฝใƒƒใƒ‰ใงใ™ใŒใ€ใ“ใฎใƒกใ‚ฝใƒƒใƒ‰ใฏ็ตๆžœใŒ 1 ใคใ ใ‘ใงใ‚ใ‚‹ใ“ใจใ‚’ๆœŸๅพ…ใ—ใฆใŠใ‚Šใ€ใใฎ 1 ใคใฎ็ตๆžœใ‚’่ฟ”ใ™ใ‹ใ€ไธ€่‡ดใ™ใ‚‹ใ‚‚ใฎใŒ 1 ใคใงใชใ‹ใฃใŸๅ ดๅˆใซใฏไพ‹ๅค–ใ‚’่ฟ”ใ—ใพใ™ใ€‚


renderIntoDocument()

renderIntoDocument(element)

React ่ฆ็ด ใ‚’ใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใ‹ใ‚‰ๅˆ‡ใ‚Š้›ขใ•ใ‚ŒใŸ DOM ใƒŽใƒผใƒ‰ใซใƒฌใƒณใƒ€ใƒผใ—ใพใ™ใ€‚ใ“ใฎ้–ขๆ•ฐใ‚’ๅฎŸ่กŒใ™ใ‚‹ใซใฏ DOM ใŒๅฟ…่ฆใงใ™ใ€‚ใ“ใ‚Œใฏไปฅไธ‹ใฎใ‚ณใƒผใƒ‰ใจๅฎŸ่ณช็š„ใซ็ญ‰ไพกใงใ™๏ผš

const domContainer = document.createElement('div');
ReactDOM.createRoot(domContainer).render(element);

่ฃœ่ถณ:

React ใ‚’ใ‚คใƒณใƒใƒผใƒˆใ™ใ‚‹ๅ‰ใซ window, window.document ใŠใ‚ˆใณ window.document.createElement ใ‚’ใ‚ฐใƒญใƒผใƒใƒซใ‚นใ‚ณใƒผใƒ—ใซๆŒใฃใฆใ„ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ใใ†ใงใชใ‘ใ‚Œใฐ React ใฏ DOM ใซใ‚ขใ‚ฏใ‚ปใ‚นใงใใชใ„ใ‚‚ใฎใจๅˆคๆ–ญใ— setState ใฎใ‚ˆใ†ใชใƒกใ‚ฝใƒƒใƒ‰ใŒๅ‹•ไฝœใ—ใชใใชใ‚Šใพใ™ใ€‚


ใใฎไป–ใฎใƒฆใƒผใƒ†ใ‚ฃใƒชใƒ†ใ‚ฃ

Simulate

Simulate.{eventName}(
  element,
  [eventData]
)

็œ็•ฅๅฏ่ƒฝใช eventData ใ‚คใƒ™ใƒณใƒˆใƒ‡ใƒผใ‚ฟใ‚’ไฝฟใฃใฆ DOM ใƒŽใƒผใƒ‰ไธŠใฎใ‚คใƒ™ใƒณใƒˆใƒ‡ใ‚ฃใ‚นใƒ‘ใƒƒใƒใ‚’ใ‚ทใƒŸใƒฅใƒฌใƒผใƒˆใ—ใพใ™ใ€‚

Simulate ใฏ React ใŒ็†่งฃใ—ใฆใ„ใ‚‹ๅ…จใฆใฎใ‚คใƒ™ใƒณใƒˆใใ‚Œใžใ‚Œใซๅฏพๅฟœใ™ใ‚‹ใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๆŒใฃใฆใ„ใพใ™ใ€‚

่ฆ็ด ใ‚’ใ‚ฏใƒชใƒƒใ‚ฏใ™ใ‚‹

// <button ref={(node) => this.button = node}>...</button>
const node = this.button;
ReactTestUtils.Simulate.click(node);

ๅ…ฅๅŠ›ใƒ•ใ‚ฃใƒผใƒซใƒ‰ใฎๅ€คใ‚’ๅค‰ๆ›ดใ—ใฆ ENTER ใ‚ญใƒผใ‚’ๆŠผใ™

// <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});

่ฃœ่ถณ

React ใฏใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใงไฝฟ็”จใ—ใฆใ„ใ‚‹ใ‚คใƒ™ใƒณใƒˆใƒ—ใƒญใƒ‘ใƒ†ใ‚ฃ๏ผˆไพ‹ใˆใฐ keyCodeใ€which ใชใฉ๏ผ‰ใ‚’ไฝ•ใ‚‚ไฝœๆˆใ—ใชใ„ใŸใ‚ใ€ใ‚ใชใŸใฏใใ‚Œใ‚‰ใ‚’ Simulate ใŒๆŒใคใƒกใ‚ฝใƒƒใƒ‰ใซๆธกใ™ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚