Я пытаюсь провести модульное тестирование, я создал песочницу с поддельным примером https://codesandbox.io/s/wizardly-hooks-32w6l (на самом деле у меня есть форма)
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;
Поэтому моей первоначальной идеей было попытаться проверить функцию умножения. И сделал это, что, очевидно, не работает
import App from "../src/App";
test("Multiply", function() {
const expected = 21;
const result = App.handleMultiply(3, 7);
expect(result).toBe(expected);
});
я получил
_App.default.handleMultiply не является функцией
Правильный ли мой подход? Если да, то как мне проверить функции? Иначе, я должен проверять с точки зрения пользователя, а не для внутренних функций (это то, что я прочитал)? Должен ли я проверить вывод на экран (я не думаю, что это разумно)?
javascript
reactjs
jestjs
user3808307
источник
источник
Ответы:
Вы можете использовать метод instance ()
enzyme
для получения экземпляра компонента React. Затем вызовитеhandleMultiply
метод напрямую и сделайте для него утверждение. Кроме того, если уhandleMultiply
метода есть побочный эффект или очень сложные вычисления, вам нужно сделать для него простое возвращаемое значение. Это создаст изолированную тестовую среду дляhandleSubmit
метода. Это означает, чтоhandleSubmit
метод не будет зависеть от возвращаемого значения реальной реализацииhandleMultiply
метода.Например
app.jsx
:table.jsx
:app.test.jsx
:Результаты модульных испытаний с отчетом о покрытии:
Исходный код: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/59796928
источник