Utilitas Tes
Cara Import
import ReactTestUtils from 'react-dom/test-utils'; // ES6
var ReactTestUtils = require('react-dom/test-utils'); // ES5 dengan npmIkhtisar
ReactTestUtils mempermudah kita melakukan tes pada komponen React dengan framework tes pilihan Anda. Di Facebook kami menggunakan Jest untuk tes JavaScript yang tidak merepotkan. Belajar cara mulai menggunakan Jest melalui situs Jest React Tutorial.
Catatan:
Kami menyarankan Anda untuk menggunakan
react-testing-libraryyang didesain untuk memfasilitasi dan mendorong penulisan tes yang menggunakan komponen Anda selayaknya seorang pengguna sebenarnya.Pilihan lain, Airbnb telah merilis utilitas tes bernama Enzyme, yang mempermudah kita dalam menyatakan, memanipulasi, dan melewati keluaran dari komponen React Anda.
act()mockComponent()isElement()isElementOfType()isDOMComponent()isCompositeComponent()isCompositeComponentWithType()findAllInRenderedTree()scryRenderedDOMComponentsWithClass()findRenderedDOMComponentWithClass()scryRenderedDOMComponentsWithTag()findRenderedDOMComponentWithTag()scryRenderedComponentsWithType()findRenderedComponentWithType()renderIntoDocument()Simulate
Referensi
act()
Untuk menyiapkan komponen sebelum penegasan, bungkus kode yang me-render komponen tersebut dan lakukan pembaruan di dalam panggilan act(). Hal ini membuat tes Anda berjalan menyerupai bagaimana React bekerja di peramban.
Catatan
Jika Anda menggunakan
react-test-renderer,react-test-rendererjuga menyediakan sebuahactekspor yang sama.
Sebagai contoh, katakanlah kita punya Counter komponen:
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = {count: 0};
this.handleClick = this.handleClick.bind(this);
}
componentDidMount() {
document.title = `Anda menekan sebanyak ${this.state.count} kali`;
}
componentDidUpdate() {
document.title = `Anda menekan sebanyak ${this.state.count} kali`;
}
handleClick() {
this.setState(state => ({
count: state.count + 1,
}));
}
render() {
return (
<div>
<p>Anda telah menekan sebanyak {this.state.count} kali</p>
<button onClick={this.handleClick}>
Tekan aku
</button>
</div>
);
}
}Ini adalah contoh bagaimana kita bisa menguji komponen ini:
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('bisa render dan memperbarui counter', () => {
// Uji render pertama dan componentDidMount
act(() => { ReactDOM.render(<Counter />, container); }); const button = container.querySelector('button');
const label = container.querySelector('p');
expect(label.textContent).toBe('Anda menekan sebanyak 0 kali');
expect(document.title).toBe('Anda menekan sebanyak 0 kali');
// Uji render kedua dan componentDidUpdate
act(() => { button.dispatchEvent(new MouseEvent('click', {bubbles: true})); }); expect(label.textContent).toBe('Anda menekan sebanyak 1 kali');
expect(document.title).toBe('Anda menekan sebanyak 1 kali');
});- Jangan lupa bahwa mengirim event DOM hanya dapat dilakukan ketika penampung DOM sudah ditambahkan ke
document. Anda dapat menggunakan library sepertireact-testing-libraryuntuk mengurangi kode boilerplate. - Dokumen
recipesberisi lebih detil mengenai cara kerjaact(), lengkap dengan contoh dan cara penggunaan.
mockComponent()
mockComponent(
componentClass,
[mockTagName]
)Oper sebuah komponen tiruan ke method ini untuk menambahkan method-method berguna yang memperbolehkan komponen tersebut untuk digunakan sebagai komponen React tiruan. Sebagai ganti dari rendering seperti biasa, komponen tiruan ini akan menjadi <div> sederhana (atau tag lain jika mockTagName disediakan) yang menampung anak komponen yang disediakan.
Catatan:
mockComponent()adalah sebuah API peninggalan. Kami menyarankan Anda menggunakanjest.mock().
isElement()
isElement(element)Mengembalikan true jika element adalah sebuah React elemen.
isElementOfType()
isElementOfType(
element,
componentClass
)Mengembalikan true jika element adalah sebuah React elemen yang memiliki tipe dari React componentClass.
isDOMComponent()
isDOMComponent(instance)Mengembalikan true jika instance adalah sebuah komponen DOM (seperti sebuah <div> atau <span>).
isCompositeComponent()
isCompositeComponent(instance)Mengembalikan true jika instance adalah sebuah komponen yang ditetapkan oleh pengguna, seperti sebuah kelas atau sebuah fungsi.
isCompositeComponentWithType()
isCompositeComponentWithType(
instance,
componentClass
)Mengembalikan true jika instance adalah sebuah komponen yang memiliki tipe dari React componentClass.
findAllInRenderedTree()
findAllInRenderedTree(
tree,
test
)Melewati semua komponen dalam tree dan mengumpulkan semua komponen yang test(component) adalah true. Ini tidak begitu bermanfaat dengan dirinya sendiri, tetapi digunakan sebagai primitif untuk alat uji lainnya.
scryRenderedDOMComponentsWithClass()
scryRenderedDOMComponentsWithClass(
tree,
className
)Mencari semua DOM elemen dalam rendered tree yang merupakan komponen DOM yang memiliki nama kelas sama dengan className.
findRenderedDOMComponentWithClass()
findRenderedDOMComponentWithClass(
tree,
className
)Seperti scryRenderedDOMComponentsWithClass() tetapi mengharapkan satu hasil dan mengembalikan satu hasil tersebut atau melempar exception jika ada lebih dari satu yang cocok.
scryRenderedDOMComponentsWithTag()
scryRenderedDOMComponentsWithTag(
tree,
tagName
)Mencari semua DOM elemen dalam rendered tree yang merupakan komponen DOM dengan nama label yang sama dengan tagName.
findRenderedDOMComponentWithTag()
findRenderedDOMComponentWithTag(
tree,
tagName
)Seperti scryRenderedDOMComponentsWithTag() tetapi mengharapkan satu hasil dan mengembalikan satu hasil tersebut atau melempar exception jika ada lebih dari satu yang cocok.
scryRenderedComponentsWithType()
scryRenderedComponentsWithType(
tree,
componentClass
)Mencari semua instansi dari komponen dengan tipe yang sama dengan componentClass.
findRenderedComponentWithType()
findRenderedComponentWithType(
tree,
componentClass
)Sama seperti scryRenderedComponentsWithType() tetapi mengharapkan satu hasil dan mengembalikan satu hasil tersebut atau melempar exception jika ada lebih dari satu yang cocok.
renderIntoDocument()
renderIntoDocument(element)Menggambar sebuah elemen React ke dalam sebuah DOM node terpisah dalam document. Fungsi ini membutuhkan sebuah DOM. Secara efektif hal ini sama dengan:
const domContainer = document.createElement('div');
ReactDOM.render(element, domContainer);Catatan:
Anda harus memiliki
window,window.documentdanwindow.document.createElementtersedia secara global sebelum Anda importReact. Jika tidak React akan berpikir tidak dapat mengakses DOM dan method-method sepertisetStatetidak akan bekerja.
Other Utilities
Simulate
Simulate.{eventName}(
element,
[eventData]
)Mensimulasikan pengiriman sebuah perihal pada suatu DOM node dengan pilihan eventData event data.
Simulate memiliki sebuah method untuk every event that React understands.
Klik sebuah elemen
// <button ref={(node) => this.button = node}>...</button>
const node = this.button;
ReactTestUtils.Simulate.click(node);Mengubah nilai dari sebuah bidang masukan lalu menekan ENTER.
// <input ref={(node) => this.textInput = node} />
const node = this.textInput;
node.value = 'jerapah';
ReactTestUtils.Simulate.change(node);
ReactTestUtils.Simulate.keyDown(node, {key: "Enter", keyCode: 13, which: 13});Catatan
Anda harus menyediakan event properti yang Anda gunakan dalam komponen (contoh keyCode, which, dll…) karena React tidak membuat event tersebut untuk Anda.