{"componentChunkName":"component---src-templates-blog-post-index-js","path":"/como-criar-testes-em-listeners-no-react-testing-library/","result":{"data":{"markdownRemark":{"fields":{"slug":"/como-criar-testes-em-listeners-no-react-testing-library/"},"frontmatter":{"category":"JavaScript","date":"29/06/2020","description":"Criar testes é essencial e importante, certo? Às vezes pode ser meio chato testar listeners. Veja como criar testes em listeners no React Testing Library.","featuredImage":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAECBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAHnLhCov//EABgQAQEBAQEAAAAAAAAAAAAAAAEAEQIS/9oACAEBAAEFAvLdcJ1mWrKsZf/EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAEDAQE/AUf/xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAgEBPwFX/8QAGRAAAgMBAAAAAAAAAAAAAAAAAAEQESFh/9oACAEBAAY/Al0pxsarP//EABsQAQACAgMAAAAAAAAAAAAAAAEAESExYaGx/9oACAEBAAE/IWgVwmFQ1e5fY7iXJZaWudxk9U//2gAMAwEAAgADAAAAEAAv/8QAGREAAgMBAAAAAAAAAAAAAAAAAAERQZHw/9oACAEDAQE/EEyDvsP/xAAXEQEBAQEAAAAAAAAAAAAAAAABABFB/9oACAECAQE/EEZxy//EABoQAQEBAAMBAAAAAAAAAAAAAAERACExUWH/2gAIAQEAAT8QsSHw75300SA+X3MBZSkxSzJOZM6mPYts0TR6xv/Z","aspectRatio":1.5384615384615385,"src":"/static/fff7b92a52de4148f5f125caf68f047f/86e90/react-testing-library.jpg","srcSet":"/static/fff7b92a52de4148f5f125caf68f047f/17b1e/react-testing-library.jpg 240w,\n/static/fff7b92a52de4148f5f125caf68f047f/2d331/react-testing-library.jpg 480w,\n/static/fff7b92a52de4148f5f125caf68f047f/86e90/react-testing-library.jpg 960w,\n/static/fff7b92a52de4148f5f125caf68f047f/42348/react-testing-library.jpg 1088w","srcWebp":"/static/fff7b92a52de4148f5f125caf68f047f/c30ee/react-testing-library.webp","srcSetWebp":"/static/fff7b92a52de4148f5f125caf68f047f/e8667/react-testing-library.webp 240w,\n/static/fff7b92a52de4148f5f125caf68f047f/87b7f/react-testing-library.webp 480w,\n/static/fff7b92a52de4148f5f125caf68f047f/c30ee/react-testing-library.webp 960w,\n/static/fff7b92a52de4148f5f125caf68f047f/a61dd/react-testing-library.webp 1088w","sizes":"(max-width: 960px) 100vw, 960px"}}},"photographer":null,"title":"Como criar testes em listeners no React Testing Library"},"timeToRead":5,"html":"<p>E ae, meus nobres, como estamos? Tentarei escrever um artigo rápido para algo que precisei num componente React que estou criando pra publicar no NPM. Como ele usar listener, eu tive que descobrir como criar testes em listeners no React Testing Library. E é simples.</p>\n<h2>O que é o React Testing Library?</h2>\n<p>Bom, isso aí <a href=\"https://testing-library.com/docs/react-testing-library/intro\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">você pode ver na documentação deles</a>, não vou perder tempo explicando esse fodasse, beleza? Mas basicamente o <a href=\"https://testing-library.com/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Testing Library</a> é uma ferramenta sagaz para você criar testes.</p>\n<p>Ele tem vários para vários frameworks, bibliotecas, como Angular, Vue, Svelte, etc. E claro, vamos falar especificamente do React, pois o componente é pra React. Mas provavelmente a técnica será bem parecida para os outros.</p>\n<h2>Beleza, Dulcetti, como criar testes em listeners no React Testing Library então?</h2>\n<p>Pra explicar, meu componente tem um <code class=\"language-text\">addEventListener</code> para verificar uma ação do usuário, que nesse exemplo é ele dar scroll na tela. Caso ele dê scroll a mais de 100px um fodasse aparece. Caso o contrário ele some.</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">ComponentFodasse</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>fodasse<span class=\"token punctuation\">,</span> setFodasse<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token generic-function\"><span class=\"token function\">useState</span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;</span>Boolean<span class=\"token operator\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">myFunction</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    window<span class=\"token punctuation\">.</span>scrollY <span class=\"token operator\">></span> <span class=\"token number\">100</span> <span class=\"token operator\">?</span> <span class=\"token function\">setFodasse</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token function\">setFodasse</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  window<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">'scroll'</span><span class=\"token punctuation\">,</span> myFunction<span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>fodasse <span class=\"token operator\">&amp;&amp;</span> <span class=\"token operator\">&lt;</span>p<span class=\"token operator\">></span>Olar<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span><span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Já quis mostrar como eu fiz, mas você pode usar qualquer listener, click, etc. Basicamente eu tenho meu state chamado <code class=\"language-text\">fodasse</code> que vai mostrar ou esconder o template do componente quando o <code class=\"language-text\">scrollY</code> for maior ou menor que 100.</p>\n<p>Depois adicionei o listener e tá tudo certo para o componente. Agora vamos partir para os testes.</p>\n<h2>Testando o listener do fodasse</h2>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 38.36734693877551%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAIABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAEF/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAduiQL//xAAXEAEBAQEAAAAAAAAAAAAAAAABEQMS/9oACAEBAAEFAi2oZ3n/xAAVEQEBAAAAAAAAAAAAAAAAAAACEP/aAAgBAwEBPwEz/8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQIBAT8BZ//EABgQAAIDAAAAAAAAAAAAAAAAAAAQESGB/9oACAEBAAY/Alc6f//EABkQAQACAwAAAAAAAAAAAAAAAAEAEUFRYf/aAAgBAQABPyGFQUWtEwIern//2gAMAwEAAgADAAAAEPgf/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAh/9oACAEDAQE/EBOt/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxAf/8QAGhAAAgIDAAAAAAAAAAAAAAAAAREAIUFRcf/aAAgBAQABPxDKajmCqwm9QBFgJKaXZ//Z'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"Ferramentas de teste Javascript\"\n        title=\"Ferramentas de teste Javascript\"\n        data-src=\"/static/51d40e568bba967ae2bcf11738d2ef30/b4294/testes.jpg\"\n        data-srcset=\"/static/51d40e568bba967ae2bcf11738d2ef30/a0fb2/testes.jpg 245w,\n/static/51d40e568bba967ae2bcf11738d2ef30/6b254/testes.jpg 490w,\n/static/51d40e568bba967ae2bcf11738d2ef30/b4294/testes.jpg 600w\"\n        sizes=\"(max-width: 600px) 100vw, 600px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>Primeiro temos que importar os caras necessários:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> fireEvent<span class=\"token punctuation\">,</span> render<span class=\"token punctuation\">,</span> screen <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@testing-library/react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> ComponentFodasse <span class=\"token keyword\">from</span> <span class=\"token string\">'./component-fodasse'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Os pontos importantes são as importações do <code class=\"language-text\">fireEvent</code> e <code class=\"language-text\">render</code>, do React Testing Library. Depois disso podemos colocar o <code class=\"language-text\">describe</code> e <code class=\"language-text\">test</code> para criar o teste:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Componente do Fodasse'</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\">test</span><span class=\"token punctuation\">(</span><span class=\"token string\">'O fodasse deve aparecer quando o scroll for maior que 100'</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\">let</span> scrolled <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&lt;</span>ComponentFodasse <span class=\"token operator\">/</span><span class=\"token operator\">></span><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>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Nesse primeiro código temos uma variável <code class=\"language-text\">scrolled</code> que começa com <code class=\"language-text\">false</code>. Criei só pra não deixar a função do listener vazia, reforçando nossos testes. Na linha de baixo tem a execução do <code class=\"language-text\">render</code>.</p>\n<p>Em alguns casos você verá uma declaração <code class=\"language-text\">const</code> chamado um <code class=\"language-text\">container</code>, mas em si já não é mais uma boa prática, como o <a href=\"https://kentcdodds.com/blog/common-mistakes-with-react-testing-library\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Kent Dodds</a> já comentou. Caso você esteja usando eu mostro uma forma de corrigir um possível bug ;)</p>\n<p>O render possui uma <a href=\"https://testing-library.com/docs/react-testing-library/api#render\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">documentação</a> sagaz. Tem até <a href=\"https://github.com/testing-library/react-testing-library/raw/master/other/cheat-sheet.pdf\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">um cheatsheet sagaz</a> para você dar uma olhada.</p>\n<h3>Mas é só isso, Dulcelino?</h3>\n<p>Claro que não, essas linhas de teste não servem pra porra nenhuma. Agora faltam outros pontos, vamos ao código:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Componente do Fodasse'</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\">test</span><span class=\"token punctuation\">(</span><span class=\"token string\">'O fodasse deve aparecer quando o scroll for maior que 100'</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\">let</span> scrolled <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&lt;</span>ComponentFodasse <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>screen<span class=\"token punctuation\">.</span><span class=\"token function\">getByText</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Olar'</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>scrolled<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBeTruthy</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><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Colocamos os dois expects, o primeiro que verifica se o texto <code class=\"language-text\">Olar</code> está disponível através do <code class=\"language-text\">screen</code>. No segundo ele espera que o <code class=\"language-text\">scrolled</code> esteja verdadeiro.</p>\n<p>Mas claro que os testes não vão passar, precisamos colocar mais linhas, mas é sempre bom ver os erros primeiro. Vamos ao complemento:</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Componente do Fodasse'</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\">test</span><span class=\"token punctuation\">(</span><span class=\"token string\">'O fodasse deve aparecer quando o scroll for maior que 100'</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\">let</span> scrolled <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&lt;</span>ComponentFodasse <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    window<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">'scroll'</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>scrolled <span class=\"token operator\">=</span> <span class=\"token operator\">!</span>scrolled<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    fireEvent<span class=\"token punctuation\">.</span><span class=\"token function\">scroll</span><span class=\"token punctuation\">(</span>window<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> target<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> scrollY<span class=\"token operator\">:</span> <span class=\"token number\">110</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>screen<span class=\"token punctuation\">.</span><span class=\"token function\">getByText</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Olar'</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>scrolled<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBeTruthy</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    fireEvent<span class=\"token punctuation\">.</span><span class=\"token function\">scroll</span><span class=\"token punctuation\">(</span>window<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> target<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> scrollY<span class=\"token operator\">:</span> <span class=\"token number\">0</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>scrolled<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBeFalsy</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><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Apesar do componente já ter um listener, nos testes você precisa colocar outro. Na função ela faz um <code class=\"language-text\">toggle</code> no <code class=\"language-text\">scrolled</code>. Depois lançamos um scroll do <code class=\"language-text\">fireEvent</code> passando <code class=\"language-text\">window</code> como parâmetro, e depois atribuindo 110 no <code class=\"language-text\">scrollY</code>.</p>\n<p>Aí os expects funcionam de boa. Ou talvez não...</p>\n<h3>Mas o que que falta agora, DulSeven?</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 480px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAMEAQIF/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAe1WzrF9AqWELAP/xAAaEAADAAMBAAAAAAAAAAAAAAABAgMAEBMR/9oACAEBAAEFAqOUWAZdNdOlXE8jTrMqCJj3X//EABURAQEAAAAAAAAAAAAAAAAAACBB/9oACAEDAQE/AaP/xAAVEQEBAAAAAAAAAAAAAAAAAAARIP/aAAgBAgEBPwFj/8QAHRAAAQQDAQEAAAAAAAAAAAAAAQACEBESIUEycf/aAAgBAQAGPwLQvadlfrsY9BX1yDqqLMf/xAAbEAEAAgMBAQAAAAAAAAAAAAABABEhMUFREP/aAAgBAQABPyEg20FSiLfT0fDJqUK9gJbd2fJ0U2RkJuWXKmJqf//aAAwDAQACAAMAAAAQI8g8/8QAFxEAAwEAAAAAAAAAAAAAAAAAAREgUf/aAAgBAwEBPxBMBsf/xAAXEQEBAQEAAAAAAAAAAAAAAAARASAx/9oACAECAQE/EEWnMf/EAB8QAQACAwABBQAAAAAAAAAAAAERIQAxYVEQQXGBsf/aAAgBAQABPxBhwiOtr8YnfJDKxSePQEwpjdKjncjcCLwMJh/M3ESPAjFcwkVIk2feBfqgQjrrdYAIAA9jP//Z'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image lazyload\"\n        alt=\"Tubos de ensaio e marca do React\"\n        title=\"Tubos de ensaio e marca do React\"\n        data-src=\"/static/3192a22f786997b16271cb658361ba25/7cc5e/js-testing.jpg\"\n        data-srcset=\"/static/3192a22f786997b16271cb658361ba25/a0fb2/js-testing.jpg 245w,\n/static/3192a22f786997b16271cb658361ba25/7cc5e/js-testing.jpg 480w\"\n        sizes=\"(max-width: 480px) 100vw, 480px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>Em si os testes passaram, mas caso você queira ou esteja usando o <code class=\"language-text\">container</code> no <code class=\"language-text\">render</code>, ele deve jogar um erro parecido com esse:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak <span class=\"token keyword\">in</span> your application. To fix, cancel all subscriptions and asynchronous tasks <span class=\"token keyword\">in</span> a useEffect cleanup function.</code></pre></div>\n<p>Pela mensagem já percebeu o que precisamos, certo? É só colocar um useEffect no component retornando o <code class=\"language-text\">removeEventListener</code>. Vamos ao código:</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> useEffect<span class=\"token punctuation\">,</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">ComponentFodasse</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>fodasse<span class=\"token punctuation\">,</span> setFodasse<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token generic-function\"><span class=\"token function\">useState</span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;</span>Boolean<span class=\"token operator\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">useEffect</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 function-variable function\">myFunction</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      window<span class=\"token punctuation\">.</span>scrollY <span class=\"token operator\">></span> <span class=\"token number\">100</span> <span class=\"token operator\">?</span> <span class=\"token function\">setFodasse</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token function\">setFodasse</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n    window<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">'scroll'</span><span class=\"token punctuation\">,</span> myFunction<span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> window<span class=\"token punctuation\">.</span><span class=\"token function\">removeEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">'scroll'</span><span class=\"token punctuation\">,</span> myFunction<span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><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><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 operator\">&lt;</span>div<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>fodasse <span class=\"token operator\">&amp;&amp;</span> <span class=\"token operator\">&lt;</span>p<span class=\"token operator\">></span>Olar<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span><span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Mas o bom é que já deixa o código até melhor.</p>\n<h2>E nos cliques?</h2>\n<p>Claro, você pode fazer com cliques no botão, mas para esse pequeno detalhe é necessário adicionar, mudar umas coisinhas:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> render<span class=\"token punctuation\">,</span> screen<span class=\"token punctuation\">,</span> fireEvent <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@testing-library/react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> ComponentFodasse <span class=\"token keyword\">from</span> <span class=\"token string\">'./social-share'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Componente do Fodasse'</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\">test</span><span class=\"token punctuation\">(</span><span class=\"token string\">'O fodasse deve aparecer quando clicar no botão'</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\">render</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&lt;</span>ComponentFodasse <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">const</span> button <span class=\"token operator\">=</span> screen<span class=\"token punctuation\">.</span><span class=\"token function\">getByRole</span><span class=\"token punctuation\">(</span><span class=\"token string\">'button'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    fireEvent<span class=\"token punctuation\">.</span><span class=\"token function\">click</span><span class=\"token punctuation\">(</span>button<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>screen<span class=\"token punctuation\">.</span><span class=\"token function\">getByText</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Olar'</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><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Deu pra ver que eu troquei o <code class=\"language-text\">scroll</code> por <code class=\"language-text\">click</code> no <code class=\"language-text\">fireEvent</code>. Ou então você pode usar o <code class=\"language-text\">userEvent</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> render<span class=\"token punctuation\">,</span> screen <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@testing-library/react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> userEvent <span class=\"token keyword\">from</span> <span class=\"token string\">'@testing-library/user-event'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> ComponentFodasse <span class=\"token keyword\">from</span> <span class=\"token string\">'./social-share'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Componente do Fodasse'</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\">test</span><span class=\"token punctuation\">(</span><span class=\"token string\">'O fodasse deve aparecer quando clicar no botão'</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\">render</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&lt;</span>ComponentFodasse <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">const</span> button <span class=\"token operator\">=</span> screen<span class=\"token punctuation\">.</span><span class=\"token function\">getByRole</span><span class=\"token punctuation\">(</span><span class=\"token string\">'button'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    userEvent<span class=\"token punctuation\">.</span><span class=\"token function\">click</span><span class=\"token punctuation\">(</span>button<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>screen<span class=\"token punctuation\">.</span><span class=\"token function\">getByText</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Olar'</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><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Usar o <code class=\"language-text\">userEvent</code> é uma boa prática, mas cuidado, não são todos os eventos que são supotados, como o scroll, por exemplo.</p>\n<p>Mas voltando ao código, nosso componente ficaria assim, mais simplificado:</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> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">ComponentFodasse</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>fodasse<span class=\"token punctuation\">,</span> setFodasse<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> useState<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Boolean</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">(false);\n\n  const myFunction = () => setFodasse(!fodasse);\n\n  return (\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token punctuation\">{</span>fodasse <span class=\"token operator\">&amp;&amp;</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Olar</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span><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>button</span> <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>myFunction<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Clica logo aqui</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n  );\n}</span></code></pre></div>\n<p>Mas claro, é um exemplo rápido e incompleto só pra mostrar como seria com o clique do mouse. Qualquer dúvida mandem um comentário aí que complemento pra você.</p>\n<h2>Finalizando</h2>\n<p>Bom, é isso, o que acharam? Já precisaram usar alguma vez esse cara? Usam o React Testing Library? Usam algum outro? Comentem ae e vamos debater sobre testes. E caso estejam com dúvidas, sugestões ou correções pra essa bosta toda que eu fiz é só comentar ;)</p>\n<p>Beijo na alcatra.</p>"}},"pageContext":{"nextPost":{"fields":{"slug":"/como-resolver-erros-no-typescript-com-atributos-nos-componentes-em-react/"},"frontmatter":{"title":"Como resolver erros no typescript com atributos nos componentes em React"}},"previousPost":{"fields":{"slug":"/como-criar-variaveis-de-ambiente-no-nextjs/"},"frontmatter":{"title":"Como criar variáveis de ambiente no Nextjs"}},"slug":"/como-criar-testes-em-listeners-no-react-testing-library/"}},"staticQueryHashes":["1271460761","2963127411","3623170217","764694655"]}