Estou tentando alguns testes de unidade, criei uma sandbox com um exemplo falso https://codesandbox.io/s/wizardly-hooks-32w6l (na realidade, tenho um formulário)
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;
Então, minha ideia inicial foi tentar testar a função multiplicar. E fez isso, o que obviamente não funciona
import App from "../src/App";
test("Multiply", function() {
const expected = 21;
const result = App.handleMultiply(3, 7);
expect(result).toBe(expected);
});
eu recebo
_App.default.handleMultiply não é uma função
Minha abordagem está certa? Se sim, como testo as funções? Senão, devo testar do ponto de vista do usuário em vez de funções internas (é isso que eu leio)? Devo testar a saída na tela (não acho que isso seja razoável)?
javascript
reactjs
jestjs
user3808307
fonte
fonte
Respostas:
Você pode usar o método instance ()
enzyme
para obter a instância do React Component. Em seguida, chame ohandleMultiply
método diretamente e faça a afirmação para ele. Além disso, se ohandleMultiply
método tiver um efeito colateral ou cálculos muito complicados, você precisará fazer um simples valor de retorno simulado. Isso criará um ambiente de teste isolado para ohandleSubmit
método. Isso significa que ohandleSubmit
método não dependerá do valor de retorno da implementação real dohandleMultiply
método.Por exemplo
app.jsx
:table.jsx
:app.test.jsx
:Resultados do teste de unidade com relatório de cobertura:
Código fonte: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/59796928
fonte