{"componentChunkName":"component---src-templates-blog-post-js","path":"/-testar-hooks-pode-ser-mais-facil-que-se-pensa/","result":{"data":{"markdownRemark":{"fields":{"slug":"/-testar-hooks-pode-ser-mais-facil-que-se-pensa/"},"frontmatter":{"titulo":"Testar os hooks pode ser mais fácil do que você pensa.","data":"28/04/2021","tag":"ReactJs","image":{"childImageSharp":{"fluid":{"src":"/static/89b569462423d696adb9cecf5b9e70e9/46604/hooktestss.png","base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABPElEQVQ4y61UTU/CQBDdn+KBo9EElX7y0dpCoVaBQk2xVUKiGBPPHoxXb0QPxIvejQf/YZPnboWGFj+TafIyO9M3b3d2dpeB+GOvb++gBNveqYISrGp0QAmm1R1QIhNUa63fEzhHFdwCf3X8o2AxJoQ03eawUl/mY6XazHHZqiN+SpqVYZmUJgoOh+T4qLgBFB5zDoYwbC8Tza1Q1pucMEA0niIeX6I/jNHq+JhcXCMYTbgfQTJclG4fsXH/grLpwR9ECONz7Mom9EZ7veSG5cHrhuj6J6l4zXRx2As5RrDbvbTkzekNSld3OApOMXuYo89tRd3PC35VsihTxD/9xV4tm8JtnU/mH5/9rylrTVp0Op2c2z3FzPJyTfmLkFo4Nt+dBvqbslXWQQk2f3oGJRj5e5gkCShBv0JqwQ+Z2srAX4hsWAAAAABJRU5ErkJggg==","aspectRatio":1,"srcSet":"/static/89b569462423d696adb9cecf5b9e70e9/7e7e9/hooktestss.png 225w,\n/static/89b569462423d696adb9cecf5b9e70e9/62b1f/hooktestss.png 450w,\n/static/89b569462423d696adb9cecf5b9e70e9/46604/hooktestss.png 500w","sizes":"(max-width: 500px) 100vw, 500px"}}}},"html":"<p>Hoje vou falar sobre os testes nos Hooks do React, mas e muito importante você ter um nível de conhecimento técnico <strong>intermediário e avançado</strong> e já conheça esses conceitos para ter uma melhor absorção do conteúdo ok?</p>\n<p><img src=\"https://media.giphy.com/media/IbUUbU4xUDJWcgGMGP/giphy.gif\"></p>\n<p>Se você ainda não tem conhecimento sobre os hooks em breve farei um post específico para ele. Leia sobre <a href=\"https://lorenakauane.com.br/como-criar-testes-no-front-end-em-reactjs/\">como criar testes no front-end em react js.</a></p>\n<h3>Vamos para o conteúdo de hoje.</h3>\n<p>Os Hooks nos permitem reutilizar o componente e a lógica de estado em <strong>diferentes</strong> componentes. Isso era complicado de fazer antes por que você precisava utilizar uma biblioteca de terceiros como o <a href=\"https://redux.js.org/\">Redux</a>. Portanto, os Hooks mudaram todo jogo de como os componentes funcionam.</p>\n<p>Vou utilizar como base o projeto <a href=\"https://github.com/LorenaKauane/react-login-testing\">react login testing</a>! E importante você clonar o projeto para dar continuidade ao contéudo.</p>\n<h3>Instalando as dependências</h3>\n<p>E importante que você tenha o <code class=\"language-text\">node</code> e o <code class=\"language-text\">npm</code> instalados. Abra o seu terminal e execute o seguinte código:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> --save-dev @testing-library/react-hooks\n<span class=\"token function\">npm</span> <span class=\"token function\">install</span> --save-dev react-test-renderer</code></pre></div>\n<p>Agora que você instalou as dependências de desenvolvimento vamos para o código.</p>\n<p>Crie uma pasta chamada hooks e adicione um hook <code class=\"language-text\">useUser</code>. Mais para frente vamos aprimorar ele.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">useUser</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> name <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Name: </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>name<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">.</span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n<p>Agora vamos criar o arquivo de testes <code class=\"language-text\">useUser.test</code> dentro da pasta dos hooks e fazer as primeiras validações como:</p>\n<ul>\n<li>✅ Deve validar se o hook está criado;</li>\n<li>✅ Deve validar se enviar um objeto vazio retornar undefined;</li>\n<li>✅ Deve validar se enviar um objeto populado;</li>\n</ul>\n<p>Nosso código ficou assim:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> renderHook <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@testing-library/react-hooks'</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useUser <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./useUser'</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'useUser tests'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Should be validating the hook is valid'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> result<span class=\"token operator\">:</span> hook <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">renderHook</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">useUser</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>hook<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveProperty</span><span class=\"token punctuation\">(</span><span class=\"token string\">'current'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Should be validating the name is undefined'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> result <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">renderHook</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">useUser</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">.</span>current<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Name: undefined.'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Should be validating the name is Leo'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> result <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">renderHook</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">useUser</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> name<span class=\"token operator\">:</span> <span class=\"token string\">'Leo'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">.</span>current<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Name: Leo.'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Niceeee! Se ao executarmos o comando esse teste com <code class=\"language-text\">npm run test</code> vamos ter um retorno parecido com esse no console:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"> PASS  src/hooks/useUser.test.js\n  useUser tests\n    ✓ Should be validating the hook is valid <span class=\"token punctuation\">(</span>11ms<span class=\"token punctuation\">)</span>\n    ✓ Should be validating the name is undefined <span class=\"token punctuation\">(</span>1ms<span class=\"token punctuation\">)</span>\n    ✓ Should be validating the name is Leo <span class=\"token punctuation\">(</span>1ms<span class=\"token punctuation\">)</span>\n\nTest Suites: <span class=\"token number\">1</span> passed, <span class=\"token number\">1</span> total\nTests:       <span class=\"token number\">3</span> passed, <span class=\"token number\">3</span> total\nSnapshots:   <span class=\"token number\">0</span> total\nTime:        <span class=\"token number\">1</span>.948s\nRan all <span class=\"token builtin class-name\">test</span> suites matching /use/i.</code></pre></div>\n<p>Agora vamos aumentar a complexidade desse hook por que todo mundo sabe que no mundo real <strong>nunca</strong> é assim.</p>\n<p><img src=\"https://media.giphy.com/media/SqfHFPbzxw98xwFOiE/giphy.gif\"></p>\n<p>Tranformei meu hook em um hook nível 2 de complexidade hahaa vamos até o nível 3</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">useUser</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>user<span class=\"token punctuation\">,</span> setUser<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">changeUser</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">user</span> <span class=\"token operator\">=></span> <span class=\"token function\">setUser</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n    changeUser<span class=\"token punctuation\">,</span>\n    nameUser<span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Name: </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>user<span class=\"token punctuation\">.</span>name<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">.</span><span class=\"token template-punctuation string\">`</span></span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Bom, até aqui tudo tranquilo certo?</p>\n<p>Nosso arquivo de testes:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> renderHook<span class=\"token punctuation\">,</span> act <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@testing-library/react-hooks'</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useUser <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./useUser'</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'useUser tests'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Should be validating the hook is valid'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> result<span class=\"token operator\">:</span> hook <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">renderHook</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">useUser</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>hook<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveProperty</span><span class=\"token punctuation\">(</span><span class=\"token string\">'current'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Should be validating the name is undefined'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> result<span class=\"token operator\">:</span> hook <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">renderHook</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">useUser</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> nameUser <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> hook<span class=\"token punctuation\">.</span>current\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>nameUser<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Name: undefined.'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Should be validating the name is Leo'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> result<span class=\"token operator\">:</span> hook <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">renderHook</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">useUser</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> changeUser <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> hook<span class=\"token punctuation\">.</span>current\n\n    <span class=\"token function\">act</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">changeUser</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> name<span class=\"token operator\">:</span> <span class=\"token string\">'Leo'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> nameUser <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> hook<span class=\"token punctuation\">.</span>current\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>nameUser<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Name: Leo.'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>No último método utilizamos o <code class=\"language-text\">act</code> do <code class=\"language-text\">testing-library</code>, mas o que exatamente ele faz?</p>\n<p>De acordo com a documentação</p>\n<blockquote>\n<p>Para preparar um componente para determinações, coloque o código de renderização e de <strong>atualizações</strong> dentro de uma chamada act(). Isso faz com que o teste rode mais próximo de como React funciona no browser. <a href=\"https://pt-br.reactjs.org/docs/test-utils.html#act\">Fonte</a></p>\n</blockquote>\n<p>Tudo que envolve atualização, da para envolver o act ou o <code class=\"language-text\">react-test-renderer</code> que ambos se comportam igual.</p>\n<p>Agora vamos melhorar nosso código utilizando o Context Api.</p>\n<p><code class=\"language-text\">useUser.js</code></p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> createContext<span class=\"token punctuation\">,</span> useContext<span class=\"token punctuation\">,</span> useState<span class=\"token punctuation\">,</span> useCallback <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span>\n\n<span class=\"token keyword\">const</span> UserContext <span class=\"token operator\">=</span> <span class=\"token function\">createContext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">UserProvider</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> children <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>user<span class=\"token punctuation\">,</span> setUser<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">const</span> changeUser <span class=\"token operator\">=</span> <span class=\"token function\">useCallback</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">user</span> <span class=\"token operator\">=></span> <span class=\"token function\">setUser</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>setUser<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">UserContext.Provider</span></span>\n      <span class=\"token attr-name\">value</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span>\n        user<span class=\"token punctuation\">,</span>\n        changeUser\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span></span>\n    <span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token punctuation\">{</span>children<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">UserContext.Provider</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">useUser</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> context <span class=\"token operator\">=</span> <span class=\"token function\">useContext</span><span class=\"token punctuation\">(</span>UserContext<span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">return</span> context\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token punctuation\">{</span> UserProvider<span class=\"token punctuation\">,</span> useUser <span class=\"token punctuation\">}</span></code></pre></div>\n<p><code class=\"language-text\">useUser.test.js</code></p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> renderHook<span class=\"token punctuation\">,</span> act <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@testing-library/react-hooks'</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> UserProvider<span class=\"token punctuation\">,</span> useUser <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./useUser'</span>\n\n<span class=\"token keyword\">let</span> hooksUser\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'useUser tests'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">beforeEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    hooksUser <span class=\"token operator\">=</span> <span class=\"token function\">renderHook</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">useUser</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n      wrapper<span class=\"token operator\">:</span> UserProvider\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Should be validating the hook is valid'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> result<span class=\"token operator\">:</span> hook <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> hooksUser\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>hook<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveProperty</span><span class=\"token punctuation\">(</span><span class=\"token string\">'current'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Should be validating the name is undefined'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> result<span class=\"token operator\">:</span> hook <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> hooksUser\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> user <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> hook<span class=\"token punctuation\">.</span>current\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toEqual</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Should be validating the name is Leo'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> result<span class=\"token operator\">:</span> hook <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> hooksUser\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> changeUser <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> hook<span class=\"token punctuation\">.</span>current\n\n    <span class=\"token function\">act</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">changeUser</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> name<span class=\"token operator\">:</span> <span class=\"token string\">'Leo'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> user <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> hook<span class=\"token punctuation\">.</span>current\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Leo'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Adicionei um <code class=\"language-text\">beforeEach</code> para renderizer um <code class=\"language-text\">hooksUser</code>, para melhorar a leitura do código.</p>\n<h3><strong>Bônus</strong></h3>\n<p>Vamos testar uma chamada na api e vamos mockar essa chamada, mas primeiro instale o <code class=\"language-text\">axios</code></p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> axios</code></pre></div>\n<p>No nosso hook, vamos adicionar uma função que faz uma chamada para <a href=\"https://reqres.in/\">reqres.in</a></p>\n<p><code class=\"language-text\">useUser.js</code></p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\">  <span class=\"token operator\">...</span>\n  <span class=\"token keyword\">const</span> getUser <span class=\"token operator\">=</span> <span class=\"token function\">useCallback</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span>  <span class=\"token punctuation\">{</span> data <span class=\"token punctuation\">}</span>  <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> axios<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"https://reqres.in/api/users/2\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">setUser</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>setUser<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">UserContext.Provider</span></span>\n      <span class=\"token attr-name\">value</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span>\n        user<span class=\"token punctuation\">,</span>\n        changeUser<span class=\"token punctuation\">,</span>\n        getUser<span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span></span>\n    <span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token punctuation\">{</span>children<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">UserContext.Provider</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token operator\">...</span></code></pre></div>\n<p>Nosso arquivo de testes:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> axios <span class=\"token keyword\">from</span> <span class=\"token string\">'axios'</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> renderHook<span class=\"token punctuation\">,</span> act <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@testing-library/react-hooks'</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> UserProvider<span class=\"token punctuation\">,</span> useUser <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./useUser'</span>\n\njest<span class=\"token punctuation\">.</span><span class=\"token function\">mock</span><span class=\"token punctuation\">(</span><span class=\"token string\">'axios'</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">let</span> hooksUser\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'useUser tests'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">beforeEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    hooksUser <span class=\"token operator\">=</span> <span class=\"token function\">renderHook</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">useUser</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n      wrapper<span class=\"token operator\">:</span> UserProvider\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Should be validating the hook is valid'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> result<span class=\"token operator\">:</span> hook <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> hooksUser\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>hook<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveProperty</span><span class=\"token punctuation\">(</span><span class=\"token string\">'current'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Should be validating the name is undefined'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> result<span class=\"token operator\">:</span> hook <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> hooksUser\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> user <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> hook<span class=\"token punctuation\">.</span>current\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toEqual</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Should be validating the name is Leo'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> result<span class=\"token operator\">:</span> hook <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> hooksUser\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> changeUser <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> hook<span class=\"token punctuation\">.</span>current\n\n    <span class=\"token function\">act</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">changeUser</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> name<span class=\"token operator\">:</span> <span class=\"token string\">'Leo'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> user <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> hook<span class=\"token punctuation\">.</span>current\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Leo'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Should be mockUser api'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    axios<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">.</span><span class=\"token function\">mockResolvedValueOnce</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      data<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        data<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n          first_name<span class=\"token operator\">:</span> <span class=\"token string\">'Leo'</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> result<span class=\"token operator\">:</span> hook <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> hooksUser\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> getUser <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> hook<span class=\"token punctuation\">.</span>current\n\n    <span class=\"token keyword\">await</span> <span class=\"token function\">act</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">await</span> <span class=\"token function\">getUser</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> user <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> hook<span class=\"token punctuation\">.</span>current\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">.</span>first_name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Leo'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Primeiramente vamos <a href=\"https://pt.wikipedia.org/wiki/Objeto_mock#:~:text=Objetos%20mock%2C%20objetos%20simulados%20ou,o%20comportamento%20de%20outros%20objetos.\">mockar</a> o axios, não queremos que ele faça a request por que os dados podem mudar a qualquer momento, mas vamos simular um retorno de um valor do nosso back-end e assim podemos adicionar validações, se, por exemplo, o usuário está autenticado ou não entre outros testes de mock.</p>\n<h3>Conclusão</h3>\n<p>Com essas dicas você pode incrementar os testes nos seus próprios hooks, um <strong>disclaimer</strong>::: essa e uma das formas de se testar hooks, tem várias outras formas e outras libs que você consegue testar. Mas essa foi a forma que eu aprendi a testar e me ajudou no dia a dia.</p>\n<p>Espero que você tenha gostado do post de hoje!</p>\n<p><img src=\"https://media.giphy.com/media/wzD3nQPA4gqHK/giphy.gif\"></p>\n<p>Até mais.</p>","timeToRead":6}},"pageContext":{"slug":"/-testar-hooks-pode-ser-mais-facil-que-se-pensa/","previousPost":{"fields":{"slug":"/o-que-voce-precisa-saber-antes-de-criar-seu-projeto-front-end/"},"frontmatter":{"templateKey":"blog-post","data":"28 de Setembro de 2021","tag":"ReactJs","titulo":"O que você precisa saber antes de criar seu projeto no front-end","locale":"pt"},"timeToRead":4},"nextPost":{"fields":{"slug":"/10-musicas-que-me-faz-ser-mais-produtiva/"},"frontmatter":{"templateKey":"blog-post","data":"12 de Fevereiro de 2021","tag":"assuntos aleatórios","titulo":"10 músicas que me faz ser mais produtiva.","locale":"pt"},"timeToRead":3},"locale":"pt"}}}