<?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: João Victor</title>
    <description>The latest articles on DEV Community by João Victor (@joaovictor6).</description>
    <link>https://dev.to/joaovictor6</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F705470%2F567d1365-1ce3-445f-a83d-b37d4885b00c.jpg</url>
      <title>DEV Community: João Victor</title>
      <link>https://dev.to/joaovictor6</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joaovictor6"/>
    <language>en</language>
    <item>
      <title>Engenharia de Plataforma - Como justificar</title>
      <dc:creator>João Victor</dc:creator>
      <pubDate>Wed, 17 Jun 2026 22:33:38 +0000</pubDate>
      <link>https://dev.to/joaovictor6/engenharia-de-plataforma-como-justificar-uma-plataforma-5cb9</link>
      <guid>https://dev.to/joaovictor6/engenharia-de-plataforma-como-justificar-uma-plataforma-5cb9</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Baseado no livro "Engenharia de Plataforma", de Camille Fournier e Ian Nowland.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  O paradoxo moderno
&lt;/h4&gt;

&lt;p&gt;Nos últimos anos ficou absurdamente fácil construir software.&lt;br&gt;
Com poucos cliques conseguimos provisionar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bancos de dados&lt;/li&gt;
&lt;li&gt;Filas&lt;/li&gt;
&lt;li&gt;Armazenamento&lt;/li&gt;
&lt;li&gt;Sistemas de observabilidade&lt;/li&gt;
&lt;li&gt;Serviços de autenticação&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A maior parte dessas capacidades já existe pronta através de provedores de nuvem e ferramentas open source.&lt;/p&gt;

&lt;p&gt;Porém, essa facilidade também trouxe uma certa fragilidade quando o assunto é manutenção. Na prática, muitas organizações acabam entrando no que Camille Fournier e Ian Nowland chamam de Pântano Generalizado (Muddy Middle): criar é fácil, evoluir é caro.&lt;/p&gt;

&lt;h4&gt;
  
  
  O problema não são os primitivos
&lt;/h4&gt;

&lt;p&gt;Serviços como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;KMS&lt;/li&gt;
&lt;li&gt;S3&lt;/li&gt;
&lt;li&gt;Lambda&lt;/li&gt;
&lt;li&gt;RDS&lt;/li&gt;
&lt;li&gt;Kafka&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;não são o problema. Criam alavancagem e nos permitem nos preocupar somente com o necessário para a construção do produto.&lt;br&gt;
Porém, cada vez que um time precisa utilizar um desses serviços, ele escreve um pouco de código para conectar sua aplicação ao serviço. Chamamos isso de cola.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A cola é inevitável. O problema está em não controlá-la!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  A multiplicação da cola
&lt;/h4&gt;

&lt;p&gt;Imagine uma empresa com vinte aplicações.&lt;/p&gt;

&lt;p&gt;Todas precisam criptografar dados utilizando KMS.&lt;br&gt;
Uma abordagem comum é:&lt;/p&gt;

&lt;p&gt;Aplicação A → Helper próprio → KMS&lt;br&gt;
Aplicação B → Helper próprio → KMS&lt;br&gt;
Aplicação C → Helper próprio → KMS&lt;/p&gt;

&lt;p&gt;Inicialmente parece uma ótima solução.&lt;br&gt;
Cada equipe resolve seu problema rapidamente.&lt;/p&gt;

&lt;p&gt;Meses depois surgem novos requisitos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rotação de chaves&lt;/li&gt;
&lt;li&gt;Novo padrão de logs&lt;/li&gt;
&lt;li&gt;Novo contrato de auditoria&lt;/li&gt;
&lt;li&gt;Mudança de permissões&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora existem vinte implementações diferentes para atualizar. O trabalho aumentou. Vamos tirar um bom tempo de algumas sprints para conseguir migrar totalmente essa cola dos projetos.&lt;/p&gt;

&lt;h4&gt;
  
  
  Centralizar a cola
&lt;/h4&gt;

&lt;p&gt;Uma alternativa é transformar esse conhecimento em um ativo compartilhado.&lt;/p&gt;

&lt;p&gt;Aplicação A ─┐&lt;br&gt;
Aplicação B ─┼─&amp;gt; Crypto SDK → KMS&lt;br&gt;
Aplicação C ─┘&lt;/p&gt;

&lt;p&gt;Agora temos somente um ponto de cola. Quem desenvolve nossos aplicativos simplesmente não interage diretamente com o KMS.&lt;br&gt;
Ao corrigir um bug, somente uma sprint é impactada, o lead time permanece pequeno e o WIP se mantém estabilizado, até mesmo em cenários de crise.&lt;/p&gt;

&lt;h4&gt;
  
  
  Nem tudo precisa ser uma feature
&lt;/h4&gt;

&lt;p&gt;Gosto de partir de uma premissa simples:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tudo que não tenha relação direta com a feature do produto &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;deveria ser chato, repetitivo e centralizado.&lt;br&gt;
Alguns exemplos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logs&lt;/li&gt;
&lt;li&gt;Observabilidade&lt;/li&gt;
&lt;li&gt;Criptografia&lt;/li&gt;
&lt;li&gt;Feature Flags&lt;/li&gt;
&lt;li&gt;Autenticação&lt;/li&gt;
&lt;li&gt;Pipelines&lt;/li&gt;
&lt;li&gt;Governança de repositórios&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nenhum desses componentes gera diferencial competitivo para a empresa. O valor está em executá-los de forma consistente. É nisso que a companhia ganha.&lt;/p&gt;

&lt;h4&gt;
  
  
  Governança também é cola
&lt;/h4&gt;

&lt;p&gt;Esse mesmo raciocínio aparece fora do código.&lt;br&gt;
Um exemplo clássico é a criação de repositórios. Em muitas empresas, o processo acontece assim:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repositório criado manualmente&lt;/li&gt;
&lt;li&gt;Permissões configuradas manualmente&lt;/li&gt;
&lt;li&gt;Pipelines configuradas manualmente&lt;/li&gt;
&lt;li&gt;Scripts adicionados manualmente
Cada novo projeto se torna uma nova oportunidade para inconsistências.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com o tempo surgem perguntas simples que ninguém consegue responder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quem possui acesso?&lt;/li&gt;
&lt;li&gt;Qual padrão de pipeline está sendo utilizado?&lt;/li&gt;
&lt;li&gt;Quais verificações são obrigatórias?&lt;/li&gt;
&lt;li&gt;Quais repositórios estão fora do padrão?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Não existe nenhum problema na stack ou na solução em si, e sim na cola espalhada por todos os serviços da companhia.&lt;/p&gt;

&lt;h4&gt;
  
  
  Engenharia de Plataforma como alavancagem
&lt;/h4&gt;

&lt;p&gt;A plataforma interna não existe para esconder a tecnologia. Ela existe para centralizar e filtrar ruídos.&lt;/p&gt;

&lt;p&gt;O desenvolvedor da solução não deveria pensar em como a empresa lida com logs, mas sim naquela solução específica. Ele deve ter um ambiente seguro e produtivo para se preocupar o máximo possível com a entrega de inovação.&lt;/p&gt;

&lt;p&gt;A Engenharia de Plataforma permite que um pequeno grupo de engenheiros consiga reduzir o trabalho de toda uma companhia, convertendo tempo de troubleshooting de ferramentas em entrega de valor para o produto.&lt;/p&gt;

&lt;h4&gt;
  
  
  Entender seus colaboradores e equipes como clientes
&lt;/h4&gt;

&lt;p&gt;A plataforma deve ter como foco oferecer uma alternativa melhor para o usuário. Não deveria ser mais complexo utilizar a abstração corporativa de logs ou de criptografia.&lt;/p&gt;

&lt;p&gt;Utilizar essas abstrações deve ser melhor e mais fácil do que usar diretamente a biblioteca do KMS, por exemplo.&lt;/p&gt;

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

&lt;p&gt;O estudo sobre plataformas internas está sendo muito interessante e estou aprendendo muito sobre como grandes players conseguem manter serviços consistentes, mesmo em um momento de tantas novidades.&lt;/p&gt;

&lt;p&gt;Além disso, esse tema me parece extremamente importante no cenário atual, onde código virou commodity e estamos cada vez mais enfrentando dificuldades para manter a qualidade diante de um volume tão grande de informação.&lt;/p&gt;

&lt;p&gt;Uma plataforma focada e bem planejada, com abertura para inovações, me parece uma das melhores formas de gerar software corporativo de verdade na era da IA.&lt;/p&gt;

&lt;p&gt;Sem plataforma, existe ruído.&lt;/p&gt;

&lt;p&gt;E uma coisa que escala rapidamente é o ruído e dívida técnica.&lt;/p&gt;

</description>
      <category>software</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Event Loop - Entendendo uma das bases do Node</title>
      <dc:creator>João Victor</dc:creator>
      <pubDate>Wed, 17 Jun 2026 21:51:46 +0000</pubDate>
      <link>https://dev.to/joaovictor6/event-loop-entendendo-uma-das-bases-do-node-41a</link>
      <guid>https://dev.to/joaovictor6/event-loop-entendendo-uma-das-bases-do-node-41a</guid>
      <description>&lt;p&gt;O Event Loop é o mecanismo responsável por decidir quando callbacks e continuidades de operações assíncronas devem ser executados. Ele não executa operações de I/O diretamente, mas organiza a ordem em que elas retornam para o JavaScript. Essa arquitetura permite que o Node.js mantenha uma única thread de execução para JavaScript, enquanto delega operações de rede, disco e sistema operacional para componentes especializados do runtime e do próprio sistema operacional.&lt;/p&gt;

&lt;h3&gt;
  
  
  Início
&lt;/h3&gt;

&lt;p&gt;Quando iniciamos um processo Node.js, o runtime carrega o arquivo de entrada da aplicação e executa todo o código síncrono disponível na Call Stack. Somente após essa etapa o Event Loop passa a assumir o controle do fluxo da aplicação, verificando continuamente quais callbacks estão prontos para execução.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   │           timers          │
   └─────────────┬─────────────┘
                 │
                 v
   ┌───────────────────────────┐
┌─&amp;gt;│     pending callbacks     │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │       idle, prepare       │
│  └─────────────┬─────────────┘      ┌───────────────┐
│  ┌─────────────┴─────────────┐      │   incoming:   │
│  │           poll            │&amp;lt;─────┤  connections, │
│  └─────────────┬─────────────┘      │   data, etc.  │
│  ┌─────────────┴─────────────┐      └───────────────┘
│  │           check           │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │      close callbacks      │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
└──┤           timers          │
   └───────────────────────────┘

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Trecho retirado da documentação principal.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Sobre o Event Loop
&lt;/h3&gt;

&lt;p&gt;Durante muito tempo tratei o Event Loop como um dos conceitos mais complexos do Node.js. Depois de estudar a documentação oficial com mais calma, percebi que a dificuldade não está no Event Loop em si, mas na quantidade de conceitos diferentes que normalmente são apresentados ao mesmo tempo: libuv, Call Stack, Promises, Microtasks, Sistema Operacional e I/O.&lt;br&gt;
Quando isolamos o papel do Event Loop, ele se torna surpreendentemente simples.&lt;/p&gt;
&lt;h3&gt;
  
  
  Definindo os passos e apresentando o iceberg 🧊
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;O Event Loop não executa trabalho. Ele agenda trabalho.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Acredito que o principal problema para entender o Event Loop esteja na confusão entre os contextos. Em um primeiro momento, imaginamos que o Event Loop é o "MacGyver" do runtime ou algo extremamente complexo. Porém, não é.&lt;/p&gt;

&lt;p&gt;O interessante na arquitetura do runtime é como cada parte é extremamente especializada. Quando falamos de Event Loop, estamos falando única e simplesmente sobre quando executar um callback.&lt;/p&gt;

&lt;p&gt;Pense no seguinte: a execução do JavaScript ocorre em uma única thread. Isso significa que os comandos vão rodar de forma linear, um após o outro, obrigatoriamente. Portanto, precisamos de algum mecanismo de coordenação para que o runtime seja minimamente confiável e siga um fluxo previsível.&lt;/p&gt;

&lt;p&gt;Outro ponto extremamente importante: quando ouvimos falar em Call Stack, Microtasks e Event Loop, devemos entender que o Event Loop não possui uma Call Stack própria. Além disso, uma microtask tem muito mais relação com a Call Stack do que com o próprio Event Loop.&lt;/p&gt;

&lt;p&gt;Se o assunto é Event Loop, podemos defini-lo como uma lista de prioridades para callbacks de naturezas diferentes. Isso explica o que ele faz, mas não explica como.&lt;/p&gt;
&lt;h3&gt;
  
  
  O Event Loop é um consumidor
&lt;/h3&gt;

&lt;p&gt;Imagine o seguinte: o Event Loop tem como função depositar na Call Stack todos os callbacks que estão na fila da fase atual. Pense em cada fase como uma fila e no Event Loop como um consumidor.&lt;br&gt;
Ele percorre obrigatoriamente as seguintes fases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Timers&lt;/li&gt;
&lt;li&gt;Pending Callbacks&lt;/li&gt;
&lt;li&gt;Idle&lt;/li&gt;
&lt;li&gt;Prepare&lt;/li&gt;
&lt;li&gt;Poll&lt;/li&gt;
&lt;li&gt;Check&lt;/li&gt;
&lt;li&gt;Close Callbacks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Assim que você executa um código com Node.js, o fluxo ocorre da seguinte forma:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Event Loop seleciona callbacks da fase atual e os coloca na Call Stack para execução.&lt;/li&gt;
&lt;li&gt;A Call Stack executa um callback e, ao final da execução, drena a fila de microtasks. É aqui que entram as Promises resolvidas e as continuações geradas por async/await. &lt;/li&gt;
&lt;li&gt;Após limpar a fila de microtasks, o runtime avança para a próxima fase do Event Loop.&lt;/li&gt;
&lt;li&gt;O processo se repete até o encerramento da aplicação.
Note que uma fase não possui necessariamente uma Call Stack própria. O runtime possui apenas uma Call Stack e uma fila de microtasks. As fases do Event Loop existem para determinar quais callbacks podem ser executados em cada momento.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Nem todas as fases são para você
&lt;/h3&gt;

&lt;p&gt;Apesar de o diagrama do Event Loop apresentar sete fases, nem todas existem para que desenvolvedores JavaScript agendem callbacks diretamente.&lt;br&gt;
Algumas fases são utilizadas internamente pela libuv para preparação e coordenação do runtime. Na prática, como desenvolvedor Node.js, você interage principalmente com Timers, Pending Callbacks, Poll, Check e Close Callbacks.&lt;/p&gt;

&lt;p&gt;As fases Idle e Prepare, por exemplo, existem para permitir que a libuv realize atividades internas antes de entrar na fase de processamento de eventos. Embora façam parte do ciclo do Event Loop, dificilmente você terá contato direto com elas durante o desenvolvimento de aplicações.&lt;/p&gt;
&lt;h4&gt;
  
  
  Timers
&lt;/h4&gt;

&lt;p&gt;Responsável por executar callbacks agendados por temporizadores.&lt;br&gt;
Exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Executado após 1 segundo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Executado periodicamente&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Importante: o tempo informado representa o tempo mínimo de espera. Não existe garantia de execução exata naquele instante.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pending Callbacks
&lt;/h4&gt;

&lt;p&gt;Executa callbacks de determinadas operações que foram adiadas para a próxima iteração do Event Loop.&lt;br&gt;
Essa fase é pouco utilizada diretamente por desenvolvedores, mas é frequentemente utilizada internamente pelo Node.js para reportar erros ou resultados de operações assíncronas.&lt;br&gt;
Exemplo conceitual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alguns callbacks relacionados a erros de rede e TCP podem passar por essa fase antes de serem executados.&lt;/p&gt;

&lt;h4&gt;
  
  
  Idle e Prepare
&lt;/h4&gt;

&lt;p&gt;As fases Idle e Prepare são utilizadas internamente pela libuv para coordenar o funcionamento do runtime antes da entrada na fase Poll.&lt;br&gt;
Durante essas etapas, a libuv realiza verificações, preparações e atividades de manutenção necessárias para o funcionamento correto do Event Loop. Apesar de fazerem parte oficialmente do ciclo, elas não possuem APIs públicas para que desenvolvedores registrem callbacks diretamente.&lt;br&gt;
Exemplos&lt;br&gt;
Não existem APIs JavaScript que permitam agendar callbacks para essas fases.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Não existe algo equivalente a isso&lt;/span&gt;

&lt;span class="nf"&gt;idle&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{});&lt;/span&gt;
&lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Quando utilizar&lt;/strong&gt;&lt;br&gt;
Nunca diretamente.&lt;br&gt;
Como desenvolvedor Node.js, você normalmente interage apenas com as fases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Timers&lt;/li&gt;
&lt;li&gt;Pending Callbacks&lt;/li&gt;
&lt;li&gt;Poll&lt;/li&gt;
&lt;li&gt;Check&lt;/li&gt;
&lt;li&gt;Close Callbacks
#### Poll
É a fase mais importante do Event Loop.
Aqui a libuv verifica se existem operações de I/O concluídas e callbacks aguardando execução.
Exemplos:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;arquivo.txt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Olá&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SELECT * FROM users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Leitura de arquivos, conexões de rede, requisições HTTP e diversas operações assíncronas costumam retornar seus callbacks para esta fase.&lt;/p&gt;
&lt;h4&gt;
  
  
  Check
&lt;/h4&gt;

&lt;p&gt;Executada logo após a fase Poll.&lt;br&gt;
É a fase utilizada pelo setImmediate().&lt;br&gt;
Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;setImmediate&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Executado na fase Check&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma forma simples de pensar é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;setTimeout(..., 0) → Timers&lt;/li&gt;
&lt;li&gt;setImmediate(...) → Check&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Close Callbacks
&lt;/h4&gt;

&lt;p&gt;Executa callbacks relacionados ao encerramento de recursos.&lt;br&gt;
Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;close&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Conexão encerrada&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;close&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Stream finalizada&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa fase permite que recursos sejam liberados corretamente antes do término definitivo da operação.&lt;/p&gt;

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

&lt;p&gt;O assustador Event Loop é, na prática, apenas um coordenador das nossas invocações. Toda a parte pesada acontece entre o kernel do sistema operacional e a libuv.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>node</category>
      <category>programming</category>
    </item>
    <item>
      <title>WIP - Glossário DevOps #1</title>
      <dc:creator>João Victor</dc:creator>
      <pubDate>Wed, 17 Jun 2026 21:36:10 +0000</pubDate>
      <link>https://dev.to/joaovictor6/wip-glossario-devops-1-171e</link>
      <guid>https://dev.to/joaovictor6/wip-glossario-devops-1-171e</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Texto com base no livro "Manual de DevOps"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;WIP significa "Work In Progress". É uma métrica essencial que representa a quantidade de trabalho iniciado, mas ainda não concluído.&lt;br&gt;
Na prática, ela ajuda a entender quantos tickets, tarefas, histórias ou demandas estão sendo executados simultaneamente pelo time.&lt;/p&gt;

&lt;h4&gt;
  
  
  WIP Alto (Ruim)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Time com 5 pessoas&lt;/li&gt;
&lt;li&gt;20 histórias abertas&lt;/li&gt;
&lt;li&gt;Todos pegam várias tarefas ao mesmo tempo&lt;/li&gt;
&lt;li&gt;Dezenas de branches simultâneas&lt;/li&gt;
&lt;li&gt;Dezenas de PRs simultâneos&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  WIP Baixo (Bom)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Time com 5 pessoas&lt;/li&gt;
&lt;li&gt;Apenas 5 histórias abertas&lt;/li&gt;
&lt;li&gt;Cada pessoa trabalhando em uma tarefa por vez&lt;/li&gt;
&lt;li&gt;O time termina as tarefas antes de começar outras&lt;/li&gt;
&lt;li&gt;Menor Lead Time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa métrica é essencial para uma boa estratégia de DevOps, além de ser um baita indicador para a saúde do projeto ou da companhia.&lt;/p&gt;

&lt;p&gt;Quanto maior o WIP:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maior troca de contexto&lt;/li&gt;
&lt;li&gt;Mais conflitos de merge&lt;/li&gt;
&lt;li&gt;Mais difícil rastrear e validar as entregas&lt;/li&gt;
&lt;li&gt;Maior "latência" no tempo de aprovação dos PRs
Se seu time está começando muitas frentes e terminando poucas demandas, você está com um WIP alto, e isso afeta diretamente a qualidade das entregas e a qualidade de vida das pessoas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sei que WIP aparece bastante nos princípios Lean, porém ainda não li o suficiente sobre o tema para me aprofundar nele.&lt;/p&gt;

</description>
      <category>devops</category>
    </item>
    <item>
      <title>Melhorando seus testes com Jest</title>
      <dc:creator>João Victor</dc:creator>
      <pubDate>Mon, 10 Jan 2022 21:26:01 +0000</pubDate>
      <link>https://dev.to/joaovictor6/acelerando-seus-testes-em-jest-com-spyon-37ci</link>
      <guid>https://dev.to/joaovictor6/acelerando-seus-testes-em-jest-com-spyon-37ci</guid>
      <description>&lt;p&gt;Nesse artigo explicarei sobre como tornar nossos testes mais performaticos e sólidos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Olá, me chamo João e me encontrei com um grande problema. Estava desenvolvendo um projeto no qual consumia uma API, para ser mais exato, está API era disponibilizada pela &lt;a href="https://rapidapi.com" rel="noopener noreferrer"&gt;rapidApi&lt;/a&gt;. Como sou um mero mortal(e estudante), estava utilizando do plano gratuito. Contudo, esse disponibiliza apenas 500 requests por mês. Sério, consegui estourar esse limite em um dia kkkkk.Seria impossivel desenvolver o app com tantas poucas requisições.&lt;br&gt;
Graças a esse "aperto", pensei em desenvolvelo utilizando de TDD(Test Driven Development), que é basicamente desenvolver guiados por teste. Nesse artigo irei mostrar o porquê. Espero que goste e que acima de tudo, te ajude!😁&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparando o ambiente
&lt;/h2&gt;

&lt;p&gt;Para recriar o ambiente no qual estava, criarei uma API super simples com &lt;a href="https://expressjs.com/" rel="noopener noreferrer"&gt;Express&lt;/a&gt;, utilizarei do &lt;a href="https://www.npmjs.com/package/axios" rel="noopener noreferrer"&gt;Axios&lt;/a&gt; para fazer as requisições e claro, faremos os testes com o &lt;a href="https://jestjs.io/" rel="noopener noreferrer"&gt;Jest&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Expres, um pouco de arroz e feijão
&lt;/h3&gt;

&lt;p&gt;A api ficou bem simples. Basicamente criei uma rota que recebe um query e retorna um JSON. Além disso fiz uma função sleep para simular uma latência.&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%2F4pstyauyotol3r5xl7cr.png" 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%2F4pstyauyotol3r5xl7cr.png" alt="API code" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configurando app para consumir nossa API
&lt;/h3&gt;

&lt;p&gt;Aqui criaremos o projeto, nele utilizaremos além dos jest para testes, usaremos também o babel para termos uma sintaxe um pouco mais agradável.(Deixarei o repositório no final do artigo, não se preocupe!)&lt;br&gt;
A estrutura do projeto 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%2Feyevu014qlnph7rfpnfo.png" 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%2Feyevu014qlnph7rfpnfo.png" alt="Project structure" width="262" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pasta __teste__:&lt;/p&gt;

&lt;p&gt;Evidentemente, será nela onde ficara nossos testes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pasta utils:&lt;/p&gt;

&lt;p&gt;Nela ficara nossa instância no Axios, segue o código:&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%2F2hfesdvgurejvg4dqu1y.png" 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%2F2hfesdvgurejvg4dqu1y.png" alt="Axios instance code" width="764" height="558"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Jest, e TDD
&lt;/h2&gt;

&lt;p&gt;Agora iremos produzir nosso teste para a função. Em TDD primeiro fazemos os testes e só depois a função.&lt;/p&gt;
&lt;h3&gt;
  
  
  Esqueleto da função
&lt;/h3&gt;

&lt;p&gt;Basicamente, iremos apenas declarar a função para podermos importa-la nos testes.&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%2F5irdab34jbqm6t8164dt.png" 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%2F5irdab34jbqm6t8164dt.png" alt="Function base" width="800" height="412"&gt;&lt;/a&gt;&lt;br&gt;
Agora sim partiremos para os testes. Temos de pensar no que a função vai fazer. Nesse caso, ela deve receber um nome, e retornar um objeto tipo: &lt;code&gt;{ message: 'Olá, teste' }&lt;/code&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%2F42jzcczk9gzyjhsi52np.png" 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%2F42jzcczk9gzyjhsi52np.png" alt="Basic test code" width="799" height="431"&gt;&lt;/a&gt;&lt;br&gt;
Esse é basicamente nosso teste. A primeiro momento ele irá falhar(ainda bem). A partir de agora temos que fazê-lo passar.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para isso, implementei nossa função, ela ficou da seguinte forma:&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%2Ftfpp3bjiafxv63d3wydl.png" 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%2Ftfpp3bjiafxv63d3wydl.png" alt="Function" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
O teste ainda não vai passar, já que como essa é uma função async e recebemos apenas uma promise.&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%2Ff9eu4e6f3f2uzx4dptll.png" 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%2Ff9eu4e6f3f2uzx4dptll.png" alt="output test" width="247" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Aprovando o teste
&lt;/h3&gt;

&lt;p&gt;Agora, vamos tratar o retorno da função &lt;em&gt;sendHelloWorld&lt;/em&gt; lá nos nossos testes. Isso significa que temos apenas que botar um &lt;em&gt;async&lt;/em&gt; na função e utilizar um &lt;em&gt;await&lt;/em&gt; no retorno da função. 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%2F9kt813nzti6aankaxqdx.png" 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%2F9kt813nzti6aankaxqdx.png" alt="FUnctional test" width="800" height="388"&gt;&lt;/a&gt;&lt;br&gt;
 Pronto, nossa função passou! Porém, existe um pequeno problema. Com o tempo, nossos testes podem acabar crescendo em quantidade, além disso. Estamos dependendo de uma API externa para executarmos o código. Isso tornam eles menos confiáveis, além de que podem ser extremamente voláteis. imagina se a latência fique alta? Não seria mais inteligente interceptarmos a &lt;em&gt;request&lt;/em&gt; que fizemos ao servidor e retornar um valor pré determinado? um &lt;strong&gt;Mock&lt;/strong&gt;? Bom, eu acredito que sim.&lt;/p&gt;

&lt;h3&gt;
  
  
  Não dependa de API's nos testes.
&lt;/h3&gt;

&lt;p&gt;Estamos na parte final do nosso artigo. porém, a mais importante. Imagine um cenário no qual temos 10 testes onde cada um deles faz uma request para algum serviço externo ou API. Nossos testes estariam diretamente ligados a algo no qual não temos o minimo controle. Eles poderiam demorar 3s ou até mesmo 20s, tudo dependeria da latência. Para evitarmos tal problema, o Jest tem uma forma bem simples. Podemos reescrever certas funções, olha que interessante!(me pareceu magia quando descobri kkkk).&lt;/p&gt;

&lt;h3&gt;
  
  
  Reescrevendo métodos
&lt;/h3&gt;

&lt;p&gt;Bom, agora que ja entendemos oque fazer, temos que realmente fazer. Olha o quão simples é reescrever uma função no jest:&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%2Fy3k851f7253l17qhjml6.png" 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%2Fy3k851f7253l17qhjml6.png" alt="Final test code" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
 Pronto, agora temos um teste totalmente isolado, isso é incrivel!!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusões
&lt;/h2&gt;

&lt;p&gt;Espero que tenha aprendido um pouco mais sobre TDD e entendido o quanto foi util pra mim essa alternativa. Além disso, irei passar aqui alguns links que me ajudaram a escrever o artigo e descobrir essa solução:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jestjs.io/docs/jest-object#jestfnimplementation" rel="noopener noreferrer"&gt;Jest.fn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=bLdEypr2e-8" rel="noopener noreferrer"&gt;TDD (Test Driven Development) // Dicionário do Programador&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Repositório com o exemplo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/JoaoVictor6/jest-example" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>tdd</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
