{"componentChunkName":"component---src-templates-blog-post-js","path":"/-testing-hooks-can-be-easier-than-you-think/","result":{"data":{"markdownRemark":{"fields":{"slug":"/-testing-hooks-can-be-easier-than-you-think/"},"frontmatter":{"titulo":"Testing hooks can be easier than you think","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>Today I talk about tests in React Hooks, but is very important you have a level knowledge intermediate and advanced and you need to know theses concepts to have a better absorption of the content ok?</p>\n<p><img src=\"https://media.giphy.com/media/IbUUbU4xUDJWcgGMGP/giphy.gif\"></p>\n<h3>Lets'go the content</h3>\n<p>The hooks allow us to reuse the component and the state logic in differents components. This was a complicated to do before because did you need to use a library like a <a href=\"https://redux.js.org/\">Redux</a>. However the hooks changed the game and how the components works</p>\n<p>I will go to use the project <a href=\"https://github.com/LorenaKauane/react-login-testing\">react login testing</a>! It's important you clone the project to continue the content.</p>\n<h3>Install dependencies</h3>\n<p>It's importante you have the <code class=\"language-text\">node</code> and <code class=\"language-text\">npm</code> installed. Now you open your terminal and run the following 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> --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>Now you have installed the developments dependencies go to the code.</p>\n<p>Create a folder called hooks and add a hook file <code class=\"language-text\">useUser.js</code>. Later on we will improve it.</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>Now Now let's create the test file <code class=\"language-text\">useUser.test</code> inside the folder hooks and make the first validations such as:\nShould be valid if send a valid object;</p>\n<ul>\n<li>✅ Should be valid hooks is valid ;</li>\n<li>✅ Should be valid if send a object empty and return undefined;</li>\n<li>✅ Should be valid if send a valid object;</li>\n</ul>\n<p>The 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> <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! If we run this test with <code class=\"language-text\">npm run test</code> we will have a return similar to this on the 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>Now we let's increase the complexity of this hooks why everyone knows that in the real world <strong>never</strong> is like that.</p>\n<p><img src=\"https://media.giphy.com/media/SqfHFPbzxw98xwFOiE/giphy.gif\"></p>\n<p>I transform my hook to level 2.</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>Now everything fine, rigth?</p>\n<p>The file tests:</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>The last method we used the act , but what exactly he does?</p>\n<p>According to the documentation</p>\n<blockquote>\n<p>To prepare a component for determinations, place the rendering and <strong>update</strong> code inside an act() call. This makes the test run closer to how React works in the browser. <a href=\"https://pt-br.reactjs.org/docs/test-utils.html#act\">Source</a></p>\n</blockquote>\n<p>Everything that involves updating, can involve the act or the <code class=\"language-text\">react-test-renderer</code> that both behave the same.</p>\n<p>Now we are going to improve our code using the 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>I added a <code class=\"language-text\">beforeEach</code> to render a <code class=\"language-text\">hooksUser</code>, to improve the reading of the code.</p>\n<h3><strong>Bonus</strong></h3>\n<p>We will test a call on the api and we will mock that call, but first install <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>In our hook, we will add a function that makes a call to <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>Tests file</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>First let's <a href=\"https://en.wikipedia.org/wiki/Objeto_mock#:~:text=Objetos%20mock%2C%20objects%20simulados%20ou,o%20comportamento%20de%20outros%20objetos.\">mock</a> The axios , we don't want him to make a request because the data can change at any time, but we are going to simulate a return of a value from our backend and so we can add validations, if, for example, the user is authenticated or not among others mock tests.</p>\n<h3>Conclusion</h3>\n<p>With these tips you can increase the tests on your own hooks, a <strong>disclaimer</strong> ::: this is one of the ways to test hooks, there are several other ways and other libs that you can test. But that was the way I learned to test and it helped me on a daily basis.</p>\n<p>I hope you enjoyed today's post!</p>\n<p><img src=\"https://media.giphy.com/media/wzD3nQPA4gqHK/giphy.gif\"></p>\n<p>Until later.</p>","timeToRead":6}},"pageContext":{"slug":"/-testing-hooks-can-be-easier-than-you-think/","previousPost":{"fields":{"slug":"/what-do-you-need-to-know-before-create-a-new-project-in-front-end/"},"frontmatter":{"templateKey":"blog-post","data":"28 de Setembro de 2021","tag":"ReactJs","titulo":"What do you need to know before create a new project in front-end","locale":"en"},"timeToRead":4},"nextPost":{"fields":{"slug":"/10-songs-that-make-me-be-more-productive/"},"frontmatter":{"templateKey":"blog-post","data":"12 de Fevereiro de 2021","tag":"random subjects","titulo":"10 songs that make me be more productive.","locale":"en"},"timeToRead":4},"locale":"en"}}}