<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Danilo Camargo Ferreira Rocha</title>
    <description>The latest articles on DEV Community by Danilo Camargo Ferreira Rocha (@dnokaneda).</description>
    <link>https://dev.to/dnokaneda</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F861476%2F2e85aa94-b36b-4cac-8cc9-cdd876ebd27c.jpg</url>
      <title>DEV Community: Danilo Camargo Ferreira Rocha</title>
      <link>https://dev.to/dnokaneda</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dnokaneda"/>
    <language>en</language>
    <item>
      <title>Testes em aplicações React com VITE + VITEST</title>
      <dc:creator>Danilo Camargo Ferreira Rocha</dc:creator>
      <pubDate>Fri, 09 Dec 2022 11:27:28 +0000</pubDate>
      <link>https://dev.to/dnokaneda/testes-em-aplicacoes-react-com-vite-vitest-386l</link>
      <guid>https://dev.to/dnokaneda/testes-em-aplicacoes-react-com-vite-vitest-386l</guid>
      <description>&lt;h2&gt;
  
  
  Por que testar aplicações?
&lt;/h2&gt;

&lt;p&gt;Não é raro encontrar em uma equipe, ou projeto, uma certa resistência no uso de testes de software. Seja por diversos motivos, desde a ideia de que o cliente não irá &lt;strong&gt;ver&lt;/strong&gt; de fato o seu resultado, prazo de entrega apertado ou falta de conhecimento do time.&lt;/p&gt;

&lt;p&gt;Independente do motivo que você não trabalhou com testes até agora, por mais que pareça um trabalho redundante em um primeiro momento, garanto que a longo prazo evitará muitos problemas.&lt;/p&gt;

&lt;p&gt;Com um conjunto de testes bem estipulados, a confiabilidade da equipe aumenta. Ajuda o time a não ter medo de quebrar o sistema na hora de &lt;strong&gt;refatorar&lt;/strong&gt; ou criar novas &lt;strong&gt;features&lt;/strong&gt;. Diminui a necessidade do &lt;strong&gt;QA&lt;/strong&gt; testar manualmente alguns processos. &lt;/p&gt;

&lt;h2&gt;
  
  
  Os tipos de testes
&lt;/h2&gt;

&lt;p&gt;Antes de iniciarmos esse projeto, é importante termos em mente quais os tipos de testes existentes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Testes Estáticos:&lt;/strong&gt; identifica erros de types e sintaxe do código, como o &lt;strong&gt;ESlint&lt;/strong&gt; e o &lt;strong&gt;TSlint&lt;/strong&gt;.&lt;br&gt;
&lt;strong&gt;2. Testes Unitários:&lt;/strong&gt; testa um pedaço do código, geralmente um componente de forma isolada.&lt;br&gt;
&lt;strong&gt;3. Testes de Integração:&lt;/strong&gt; testa a interação de alguns componentes para se certificar de que deveriam funcionar corretamente, como por exemplo em um formulário.&lt;br&gt;
&lt;strong&gt;4. Testes End to End (E2E):&lt;/strong&gt; Simula o fluxo de um usuário dentro do sistema do início ao fim, como por exemplo em um e-commerce, desde a escolha de um produto até o pedido final.&lt;/p&gt;

&lt;p&gt;Nesse artigo iremos cobrir os testes unitários e te integração, ok?&lt;/p&gt;
&lt;h2&gt;
  
  
  Por que usar o VITE + VITEST?
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;VITE&lt;/strong&gt; é uma ferramenta de build rápida de compilar projetos react. Aliado ao &lt;strong&gt;VITEST&lt;/strong&gt;, que contém uma estrutura de testes integradas ao VITE, diminui a complexidade de configurações.&lt;/p&gt;
&lt;h2&gt;
  
  
  Let's Start!
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Link do projeto:&lt;/strong&gt; &lt;a href="https://dev.tovitest-examples"&gt;https://github.com/dnokaneda/vitest-examples&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Primeiro precisamos criar o nosso projeto, certo? Para isso, rode o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn create vite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na sequencia, digite um nome de projeto da sua preferência (no nosso caso &lt;em&gt;vitest-examples&lt;/em&gt;), selecione o framework &lt;strong&gt;react&lt;/strong&gt; e a variante &lt;strong&gt;typescript&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A instalação será iniciada e uma pasta será criada com o nome do projeto. Acesse-a pelo &lt;strong&gt;prompt de comando&lt;/strong&gt; e rode o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seu navegador você verá o seguinte resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foxj9gelduxocv3i8lwyy.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foxj9gelduxocv3i8lwyy.jpg" alt="vite+react" width="454" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Alterar o tema p/ dark
&lt;/h2&gt;

&lt;p&gt;Nesse primeiro momento, vamos somente alterar o arquivo &lt;strong&gt;index.css&lt;/strong&gt; para o &lt;strong&gt;tema dark&lt;/strong&gt;, que deixará a tela um pouco mais agradável. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fywc6im4sef070v9n0iky.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fywc6im4sef070v9n0iky.jpg" alt="index.css" width="800" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Não se preocupe na estilização agora, afinal, o objetivo aqui é realizar diversos exemplos de testes na plataforma.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalação de dependências
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;VITEST&lt;/strong&gt; é nativo do &lt;strong&gt;VITE&lt;/strong&gt;, simplificando muito a parte de configuração. Evita que você utilize o babel ou configurações específicas ao utilizar outras libs de testes.&lt;/p&gt;

&lt;p&gt;Vamos instalar todas as dependências que precisamos para iniciarmos os nossos testes. Segue o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add -D vitest @testing-library/react @testing-library/jest-dom jsdom
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além do &lt;strong&gt;VITEST&lt;/strong&gt;, utilizaremos a biblioteca do &lt;strong&gt;testing-libray&lt;/strong&gt;, que contém diversas ferramentas de testes com compatibilidade para diversos frameworks, inclusive o react.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;JSDOM&lt;/strong&gt; também será instalado justamente para fazer as vezes do browser. Os testes serão rodados via prompt de comando, portanto, o responsável por "simular" o projeto e interagir com ele será o &lt;strong&gt;JSDOM&lt;/strong&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  vite.config.ts
&lt;/h2&gt;

&lt;p&gt;Após a instalação, vamos configurar de fato o ambiente de testes. Para isso, acesse o arquivo &lt;strong&gt;vite.config.ts&lt;/strong&gt; e adicione os itens marcados na imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4o5a3qntshqt8i92fxce.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4o5a3qntshqt8i92fxce.jpg" alt="vite.config.ts" width="680" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  package.json
&lt;/h2&gt;

&lt;p&gt;Agora precisamos criar o comando test no arquivo &lt;strong&gt;package.json&lt;/strong&gt; para rodarmos os testes de nossa aplicação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41kbofzheo2u44b021a2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41kbofzheo2u44b021a2.jpg" alt="package.json" width="651" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O primeiro teste
&lt;/h2&gt;

&lt;p&gt;Vamos começar com um teste simples: nos certificar que a aplicação está rodando. Para isso, criaremos um arquivo chamado &lt;strong&gt;App.test.tsx&lt;/strong&gt; dentro da pasta src. &lt;/p&gt;

&lt;p&gt;Segue o código que deveremos escrever:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftl4l8szdrmgt3b59exiv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftl4l8szdrmgt3b59exiv.jpg" alt="App.test.tsx" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos à algumas explicações. Na &lt;em&gt;linha 3&lt;/em&gt; estamos importando 3 funções principais do &lt;strong&gt;vitest&lt;/strong&gt;: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;describe:&lt;/strong&gt; é uma função que define um contexto para um grupo de testes que serão executados. Normalmente é criado um contexto para cada componente ou tela que será testado no projeto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;test:&lt;/strong&gt; é a função de teste em si. Recebe um nome como parâmetro e define um conjunto de expectativas ao funcionamento do componente a ser testado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;expect:&lt;/strong&gt; é a função que verifica a hipótese a ser testada do componente. Foi renderizado com sucesso? Existe um texto específico na tela?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para executarmos nosso primeiro teste será preciso rodar o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn test App.test.tsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado será esse:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhi161xd6a80sr8jgkqvx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhi161xd6a80sr8jgkqvx.jpg" alt="app.test.tsx" width="589" height="397"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Afinal, o que aconteceu aqui?
&lt;/h2&gt;

&lt;p&gt;Na &lt;em&gt;linha 9&lt;/em&gt; utilizamos o método &lt;strong&gt;render&lt;/strong&gt; do &lt;strong&gt;testing-library&lt;/strong&gt;, que irá "&lt;em&gt;renderizar na memória&lt;/em&gt;" a página App, com o auxílio do JSDOM, para que testemos uma hipótese (&lt;em&gt;linha 10&lt;/em&gt;): Existe um texto &lt;em&gt;"Vite + React"&lt;/em&gt; no documento? &lt;/p&gt;

&lt;p&gt;O método &lt;strong&gt;render&lt;/strong&gt; possui um conjunto de funções que nos ajudarão a testar diversos aspectos do projeto, seja encontrar um texto, uma tag, uma classe css ou estilo. Veremos alguns exemplos adiante.&lt;/p&gt;
&lt;h2&gt;
  
  
  Componente button
&lt;/h2&gt;

&lt;p&gt;Em um projeto &lt;strong&gt;react&lt;/strong&gt; é comum termos diversos componentes com funções bem específicas, e é aqui que os testes unitários fazem bastante sentido. Queremos ter a certeza que cada componente está funcionando corretamente antes de subirmos para produção.&lt;/p&gt;

&lt;p&gt;Um botão será um exemplo perfeito para esse cenário. &lt;br&gt;
Segue o código de um botão básico em react:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp2xs097ivjwkljc9jmor.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp2xs097ivjwkljc9jmor.jpg" alt="Button.tsx" width="771" height="590"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Teste unitário: componente button
&lt;/h2&gt;

&lt;p&gt;Aqui iremos testar duas funções básicas do botão: renderizar na tela e disparar o evento de clique. Claro, há outras possibilidades, mas vamos começar devagar.&lt;/p&gt;

&lt;p&gt;Um novo arquivo chamado &lt;strong&gt;Button.test.tsx&lt;/strong&gt; será criado:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozh1zf9e7iz43a43owlb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozh1zf9e7iz43a43owlb.jpg" alt="button.test.tsx" width="800" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Entendendo o teste acima:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linha 7:&lt;/strong&gt; cria um conjunto de testes com o nome de "Button test";&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 8:&lt;/strong&gt; função de teste de renderização do componente;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 13:&lt;/strong&gt; função de teste do disparo do evento de clique;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 14:&lt;/strong&gt; função genérica do &lt;strong&gt;VITEST&lt;/strong&gt; que verificará se foi disparado ou não após o clique do botão;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 16:&lt;/strong&gt; &lt;em&gt;getByTestId&lt;/em&gt; é a função que será usada para encontrar um elemento com testId específico no documento renderizado;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 20:&lt;/strong&gt; O método &lt;em&gt;fireEvent&lt;/em&gt; irá disparar a função click no elemento com o textId &lt;em&gt;"component-button"&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 21:&lt;/strong&gt; O &lt;em&gt;expect&lt;/em&gt; verificará se a função &lt;em&gt;"handleClick"&lt;/em&gt; foi executada 1 única vez (&lt;em&gt;toHaveBeenCalledTimes&lt;/em&gt;);&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Novamente, segue o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn test Button.test.tsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado será esse:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjps0xx9qqayijugy2e9q.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjps0xx9qqayijugy2e9q.jpg" alt="button.test.tsx" width="725" height="325"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Teste de Integração: App.tsx
&lt;/h2&gt;

&lt;p&gt;Agora que já descobrimos que o botão está funcionando corretamente (de forma isolada, muito importante entendermos isso), nossa próxima etapa é testá-lo na página &lt;strong&gt;App.tsx&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Mas antes, precisaremos fazer alguns ajustes no projeto.&lt;/p&gt;
&lt;h2&gt;
  
  
  App.tsx
&lt;/h2&gt;

&lt;p&gt;Como citado anteriormente, estamos aproveitando o código gerado pelo &lt;strong&gt;VITE&lt;/strong&gt;, portanto não iremos perder tempo criando estilos próprios nesse momento. A única inclusão é na &lt;em&gt;linha 44&lt;/em&gt;, ao adicionar uma margem à direita.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F907gg0m64w608fvymgch.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F907gg0m64w608fvymgch.jpg" alt="index.css" width="764" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O motivo da margem? Vamos criar dois botões (&lt;em&gt;linhas 24 e 24&lt;/em&gt;), uma para somar e outro para subtrair o valor de um contador. Eles ficarão alinhados horizontalmente na tela.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foiftz224z7uk3en41u17.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foiftz224z7uk3en41u17.jpg" alt="app.tsx" width="500" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O código ficou assim:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fho3qa6eg0ourqbrogjos.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fho3qa6eg0ourqbrogjos.jpg" alt="app.tsx" width="800" height="709"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  O Problema
&lt;/h2&gt;

&lt;p&gt;Existe um detalhe no código acima que queria explorar com vocês. Reparem que no arquivo &lt;strong&gt;App.tsx&lt;/strong&gt; existem dois botões (&lt;em&gt;linha 24 e 25&lt;/em&gt;). Cada um com uma função específica. &lt;/p&gt;

&lt;p&gt;Se formos criar um teste de integração para testar a soma, por exemplo, o &lt;strong&gt;VITEST&lt;/strong&gt; não conseguirá identificar o botão exato a ser usado, uma vez que ambos estarão com o mesmo &lt;strong&gt;data-testId&lt;/strong&gt;. &lt;/p&gt;
&lt;h2&gt;
  
  
  Button.tsx
&lt;/h2&gt;

&lt;p&gt;A solução é bem simples: passar o &lt;strong&gt;dataTestId&lt;/strong&gt; por parâmetro para o componente (&lt;em&gt;linha 8&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffs8bb2l9mzgvleyljmp7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffs8bb2l9mzgvleyljmp7.jpg" alt="button.tsx" width="780" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dessa forma, caso tenhamos um valor no parâmetro &lt;strong&gt;dataTestId&lt;/strong&gt; ele será utilizado, do contrário, será usado o &lt;strong&gt;data-testId&lt;/strong&gt; padrão (&lt;em&gt;"component-button"&lt;/em&gt;).&lt;/p&gt;
&lt;h1&gt;
  
  
  App.tsx
&lt;/h1&gt;

&lt;p&gt;Vamos atualizar o código do arquivo &lt;strong&gt;App.tsx&lt;/strong&gt; com os ids específicos de cada botão (&lt;em&gt;linhas 27 e 33&lt;/em&gt;). Dessa forma conseguiremos disparar um evento de clique em cada botão na hora dos testes.&lt;/p&gt;

&lt;p&gt;Além disso, será necessário incluir um data-testid no valor do contador para monitorar se o teste foi realizado com sucesso (&lt;em&gt;linha 22&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0k3wpuq8zhbuur4lbfis.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0k3wpuq8zhbuur4lbfis.jpg" alt="app.tsx" width="800" height="853"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Testes de Integração: finalmente
&lt;/h2&gt;

&lt;p&gt;Agora sim! Com todos os ajustes feitos, podemos criar o nosso teste de integração. &lt;/p&gt;

&lt;p&gt;No arquivo &lt;strong&gt;App.test.tsx&lt;/strong&gt; iremos criar dois novos testes, um para o botão soma (&lt;em&gt;linha 13&lt;/em&gt;) e outro para a subtração (&lt;em&gt;linha 20&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv48qi2w0hem2uod5fm5w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv48qi2w0hem2uod5fm5w.jpg" alt="app.test.tsx" width="800" height="567"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Entendendo o teste acima:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linha 13:&lt;/strong&gt; Renderiza a página App. Além disso, através da desestruturação da função render, obtemos o método &lt;strong&gt;getByTestId&lt;/strong&gt;, que será usado para encontrar o botão específico do qual queremos testar;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 16:&lt;/strong&gt; Dispara o evento de clique no botão de soma. Só conseguimos identificar o botão exato, pois criamos um &lt;strong&gt;dataTestId&lt;/strong&gt; próprio para cada botão na tela;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 17:&lt;/strong&gt; Testa a condição proposta: Ao clicar o botão de soma, espera-se que o valor vá de 0 para 1. Usando o método &lt;strong&gt;getByTestId("total-cliques")&lt;/strong&gt; podemos ler o conteúdo exato do contador.;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ao rodar o teste, temos o seguinte resultado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn test App.test.tsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F62srcizbyq8u4ddib3i6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F62srcizbyq8u4ddib3i6.jpg" alt="app.test.tsx" width="576" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Refactore App.test.tsx
&lt;/h2&gt;

&lt;p&gt;Perceba que criamos dois testes muito parecidos, um para o botão soma e outro para a subtração. Podemos uni-los em um único teste, conforme o exemplo abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzoa06g630e8ewoih1qlw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzoa06g630e8ewoih1qlw.jpg" alt="app.test.tsx" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mas qual a vantagem?&lt;/strong&gt; Bom, há um pequeno ganho no desempenho, pois a renderização da página é feita uma única vez para o testes dos botões, mas perde-se o rastreio de qual botão em si falhou, uma vez que os dois botões precisam funcionar para o teste ser bem sucedido. &lt;/p&gt;

&lt;p&gt;Fica ao seu critério. Depende da complexidade da tela ou das funções de cada botão. Por isso é importante pensar exatamente o que cada teste vai realizar, garantindo assim a qualidade do seu código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testes de classes e estilos
&lt;/h2&gt;

&lt;p&gt;Em projetos grandes, com uma equipe de &lt;strong&gt;UX/UI&lt;/strong&gt; comprometidas a criar um &lt;strong&gt;design-system&lt;/strong&gt; da aplicação, o front-end precisa garantir que os padrões visuais estipulados pelo time sejam atendidos.&lt;/p&gt;

&lt;h2&gt;
  
  
  index.css
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Vamos criar um cenário:&lt;/strong&gt; O botão primário e secundário possuem estilos próprios. Caso mude de programador, o teste irá garantir que o componente mantém o padrão visual do projeto. Se a cor do botão é azul, é azul! Certo?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1mp25oasv6kn0ew8b5zn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1mp25oasv6kn0ew8b5zn.jpg" alt="index.css" width="800" height="669"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No componente &lt;strong&gt;Button.tsx&lt;/strong&gt;, vamos criar um novo parâmetro: secondary (&lt;em&gt;linha 6 e 9&lt;/em&gt;). Em &lt;strong&gt;className&lt;/strong&gt; criamos uma condição para verificar se o botão é primário (padrão) ou secundário (&lt;em&gt;linha 12&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fngjtwfqan7zxokukafh2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fngjtwfqan7zxokukafh2.jpg" alt="button.tsx" width="786" height="616"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos agora colocar o botão de subtrair como secundário. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffu2cys546pqz6smq7c30.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffu2cys546pqz6smq7c30.jpg" alt="app.tsx" width="781" height="874"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Testes unitários: Estilos e Classes
&lt;/h2&gt;

&lt;p&gt;Para garantir o &lt;strong&gt;style-guide&lt;/strong&gt; do projeto, vamos criar os testes abaixo no arquivo &lt;strong&gt;Button.test.tsx&lt;/strong&gt;:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwrrod0w2z1xpx3k382x.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwrrod0w2z1xpx3k382x.jpg" alt="button.test.tsx" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Foram criados quatro novos testes&lt;/strong&gt;: dois para o botão primário e dois para o secundário, sendo um deles um teste de classes e outro um teste de estilos.&lt;/p&gt;

&lt;p&gt;Como exemplo, vamos entender o teste primário:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linha 28:&lt;/strong&gt; na função &lt;strong&gt;expect&lt;/strong&gt;, utlizamos o método &lt;strong&gt;toHaveClass&lt;/strong&gt; para identificar se a classe &lt;em&gt;"button-primary"&lt;/em&gt; está sendo usada no componente. O parâmetro &lt;strong&gt;exact&lt;/strong&gt; garante que a única classe a ser usada no botão é a &lt;em&gt;"button-primary"&lt;/em&gt;. Se preferir usar várias classes no componente e queira testar se a &lt;em&gt;"button-primary"&lt;/em&gt; esteja entre elas, basta colocar o parâmetro &lt;strong&gt;exact&lt;/strong&gt; como &lt;strong&gt;false&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 36:&lt;/strong&gt; O método &lt;strong&gt;toHaveStyle&lt;/strong&gt; verificará se o estilo a ser testado (&lt;em&gt;"backgroundColor"&lt;/em&gt;) contém o valor correto (&lt;em&gt;"#7dd3fc"&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvaqtokbciz4yn948ejlz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvaqtokbciz4yn948ejlz.jpg" alt="button.test.tsx" width="592" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Nesse artigo foram demonstrados alguns testes básicos que podemos utilizar em nossos projetos de &lt;strong&gt;front-end&lt;/strong&gt;. Testamos componentes e funções básicas. Aplicamos alguns conceitos de testes unitários e de integração, o que já é um grande começo. O real poder dos testes automatizados é no fluxo do sistema, simulando comportamentos do usuário e identificando possíveis erros. &lt;/p&gt;

&lt;p&gt;Espero que esse artigo lhe incentive a iniciar o programa de testes de suas aplicações. Adoraria ler suas considerações e caso tenha alguma sugestão/melhoria, por favor, compartilhe comigo.&lt;/p&gt;

&lt;p&gt;Grande abraço!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>database</category>
      <category>github</category>
      <category>product</category>
    </item>
    <item>
      <title>React Hooks: useRef</title>
      <dc:creator>Danilo Camargo Ferreira Rocha</dc:creator>
      <pubDate>Thu, 19 May 2022 21:30:26 +0000</pubDate>
      <link>https://dev.to/dnokaneda/react-hooks-useref-no7</link>
      <guid>https://dev.to/dnokaneda/react-hooks-useref-no7</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Com o advento dos &lt;strong&gt;Hooks&lt;/strong&gt; a partir da versão 16.8 do React, é possível escrever componentes funcionais e gerenciar o ciclo de vida do próprio componente. &lt;/p&gt;

&lt;p&gt;A própria biblioteca do react disponibiliza diversos hooks que irão facilitar a sua vida na hora de programar. Nesse artigo vamos estudar um desses hooks, o &lt;em&gt;useRef&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pra que serve o useRef?
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;useRef&lt;/em&gt; é um Hook que pode ser usado basicamente de três maneiras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;permitir o acesso ao elemento DOM;&lt;/li&gt;
&lt;li&gt;rastrear mudanças de estado;&lt;/li&gt;
&lt;li&gt;evitar re-renderizações de componentes;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Segue abaixo alguns exemplos simples para o uso desse hook na prática:&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo 01: Acesso ao elemento DOM
&lt;/h2&gt;

&lt;p&gt;Normalmente nós deixamos o próprio React manipular os elementos DOM, mas em alguns casos, podemos utilizar o &lt;em&gt;useRef&lt;/em&gt; para acessá-los, sem causar nenhum problema de desempenho.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vBUHPH53--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jzy0qnji33cxhyicqwxf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vBUHPH53--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jzy0qnji33cxhyicqwxf.jpg" alt="Image description" width="730" height="100"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ao clicar nos botões, temos acesso às propriedades do elemento input.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bPlJG0cG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0po8uo7xmhuae6ulysq8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bPlJG0cG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0po8uo7xmhuae6ulysq8.png" alt="Image description" width="880" height="962"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo 02: Mudanças de estado
&lt;/h2&gt;

&lt;p&gt;O hook &lt;em&gt;useRef&lt;/em&gt; também pode ser utilizado para rastrear mudanças de estado. Isso ocorre porque o &lt;em&gt;useRef&lt;/em&gt; persiste o valor do estado entre as renderizações.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--maEA3zg7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nblelzgr1eqqbl191952.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--maEA3zg7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nblelzgr1eqqbl191952.jpg" alt="Image description" width="730" height="185"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ao clicar nos botões, podemos monitorar as mudanças de estado da variável count.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XXiWkDFG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9hs1y3h1slo42k47hdwx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XXiWkDFG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9hs1y3h1slo42k47hdwx.png" alt="Image description" width="880" height="740"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo 03: Re-renderizações de componentes
&lt;/h2&gt;

&lt;p&gt;Em alguns cenários, precisamos rastrear um estado utilizando o useEffect e, dependendo de como o fizermos, poderá causar um looping infinito ou renderizações desnecessárias.&lt;/p&gt;

&lt;p&gt;Utilizando o &lt;em&gt;useRef&lt;/em&gt;, podemos evitar esse problema.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--70wNLe0v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2dw8cw6ses4u54qbxd5r.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--70wNLe0v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2dw8cw6ses4u54qbxd5r.jpg" alt="Image description" width="735" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ao digitar nos inputs, podemos ver a diferênça no número de renderizações do código.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QdhUghbY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0hexrlcig8gus6odg30x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QdhUghbY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0hexrlcig8gus6odg30x.png" alt="Image description" width="880" height="1088"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Neste artigo abordamos a utilização do hook &lt;em&gt;useRef&lt;/em&gt; em alguns exemplos práticos. O &lt;em&gt;useRef&lt;/em&gt; retorna um objeto mutável que possui a propriedade .current, assumindo qualquer valor, seja um elemento DOM ou do React.&lt;/p&gt;

&lt;p&gt;Quer praticar? Segue o &lt;a href="https://github.com/dnokaneda/react-hooks"&gt;&lt;strong&gt;link do código fonte&lt;/strong&gt;&lt;/a&gt; utilizado nesse projeto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fontes:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.w3schools.com/react/react_useref.asp"&gt;w3schools&lt;/a&gt;&lt;br&gt;
&lt;a href="https://pt-br.reactjs.org/docs/refs-and-the-dom.html"&gt;reactjs.org&lt;/a&gt;&lt;br&gt;
&lt;a href="https://medium.com/@guigaoliveira_/conhecendo-o-useref-do-react-9d67e66"&gt;medium.com/@guigaoliveira_&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
