ใในใใฆใผใใฃใชใใฃ
ใคใณใใผใ
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 ใณใณใใผใใณใใฎๅบๅใฎใขใตใผใใๆไฝใใใใฆๆจชๆญ็ใชๅฆ็ใ็ฐกๅใซ่กใใพใใ
act()
mockComponent()
isElement()
isElementOfType()
isDOMComponent()
isCompositeComponent()
isCompositeComponentWithType()
findAllInRenderedTree()
scryRenderedDOMComponentsWithClass()
findRenderedDOMComponentWithClass()
scryRenderedDOMComponentsWithTag()
findRenderedDOMComponentWithTag()
scryRenderedComponentsWithType()
findRenderedComponentWithType()
renderIntoDocument()
Simulate
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 ใๆใคใกใฝใใใซๆธกใๅฟ ่ฆใใใใพใใ