Saya mencoba beberapa unit pengujian, saya membuat kotak pasir dengan contoh palsu https://codesandbox.io/s/wizardly-hooks-32w6l (pada kenyataannya saya memiliki formulir)
class App extends React.Component {
constructor(props) {
super(props);
this.state = { number: 0 };
}
handleSubmit = (number1, number2) => {
this.setState({ number: this.handleMultiply(number1, number2) })
}
handleMultiply = (number1, number2) => {
return number1 * number2
}
render() {
const { number } = this.state;
return (
<div className="App">
<form onSubmit={e => this.handleSubmit(3, 7)}>
<input type="submit" name="Submit" value="Multiply" />
</form>
<Table number={number} />
</div>
);
}
}
export default App;
Jadi ide awal saya adalah mencoba menguji fungsi multiplikasi. Dan melakukan ini, yang jelas tidak berhasil
import App from "../src/App";
test("Multiply", function() {
const expected = 21;
const result = App.handleMultiply(3, 7);
expect(result).toBe(expected);
});
saya mendapat
_App.default.handleMultiply bukan fungsi
Apakah pendekatan saya benar? Jika ya lalu bagaimana cara menguji fungsi? Selain itu, haruskah saya menguji dari sudut pandang pengguna alih-alih untuk fungsi internal (ini yang saya baca)? Haruskah saya menguji output di layar (saya pikir ini tidak masuk akal)?
javascript
reactjs
jestjs
pengguna3808307
sumber
sumber
Jawaban:
Anda dapat menggunakan metode instance ()
enzyme
untuk mendapatkan instance React Component. Kemudian, panggilhandleMultiply
metode secara langsung dan buat pernyataan untuk itu. Selanjutnya, jikahandleMultiply
metode ini memiliki efek samping atau perhitungan yang sangat rumit, Anda perlu membuat nilai pengembalian yang diejek sederhana untuknya. Ini akan membuat lingkungan uji terisolasi untukhandleSubmit
metode. Ini berartihandleSubmit
metode tidak akan tergantung pada nilai balik dari implementasi nyatahandleMultiply
metode.Misalnya
app.jsx
:table.jsx
:app.test.jsx
:Hasil tes unit dengan laporan cakupan:
Kode sumber: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/59796928
sumber