<?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: Wesley Matos</title>
    <description>The latest articles on DEV Community by Wesley Matos (@wricke).</description>
    <link>https://dev.to/wricke</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%2F555716%2Fb48cfea5-3115-4c81-869e-c2967c2524c1.jpeg</url>
      <title>DEV Community: Wesley Matos</title>
      <link>https://dev.to/wricke</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wricke"/>
    <language>en</language>
    <item>
      <title>O básico sobre testes unitários e dublês de testes</title>
      <dc:creator>Wesley Matos</dc:creator>
      <pubDate>Tue, 24 Aug 2021 22:21:39 +0000</pubDate>
      <link>https://dev.to/wricke/o-basico-sobre-testes-unitarios-2ehh</link>
      <guid>https://dev.to/wricke/o-basico-sobre-testes-unitarios-2ehh</guid>
      <description>&lt;h2&gt;
  
  
  O que são testes unitários?
&lt;/h2&gt;

&lt;p&gt;Teste unitário, como o nome sugere, é o teste de uma unidade do sistema, ou seja, de um pedaço do seu código. Não é como um teste de ponta-a-ponta, onde todo o sistema é testado com alguma automatização ou até mesmo de maneira manual (com uma pessoa preenchendo os campos, clicando nos botões, etc).&lt;/p&gt;

&lt;p&gt;Um dos grandes objetivos das equipes é reaproveitar o máximo de código possível... Como garantir que um código que será utilizado em vários lugares do seu sistema está funcionando corretamente? Com testes unitários! Os testes unitários irão garantir a confiabilidade do seu sistema mesmo após mudanças (em caso de problema, os testes irão quebrar, e assim você saberá que sua implementação não está funcionando como deveria).&lt;/p&gt;

&lt;p&gt;Para fim de exemplos, vamos criar uma função que chama outra função. Vamos chamá-la de &lt;code&gt;proxy&lt;/code&gt;&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;proxy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um caminho para testar a função &lt;code&gt;proxy&lt;/code&gt; sem perder tempo criando um método para ser passado pra ela ou pensando em parâmetros para essa função, seria usar dublês de testes. &lt;/p&gt;

&lt;h3&gt;
  
  
  O que são dublês de testes
&lt;/h3&gt;

&lt;p&gt;Dentro dos conceitos essenciais para dominar os testes unitários, estão os dublês de testes. Hoje vamos falar um pouco sobre o que são os dublês de testes.&lt;/p&gt;

&lt;p&gt;Assim como dublês de filmes estão para atores principais, os dublês de testes  estão para as implementações reais.&lt;/p&gt;

&lt;h4&gt;
  
  
  Tipos de dublês
&lt;/h4&gt;

&lt;p&gt;Basicamente, existem 5 tipos de dublês de testes. Sendo eles, dummies, fakes, stubs, spies e mocks.&lt;/p&gt;

&lt;h5&gt;
  
  
  Dummies
&lt;/h5&gt;

&lt;p&gt;A tradução literal seria "bobos", ou seja, são argumentos que não tem um valor real. Aqui vai um exemplo para tornar tudo mais claro:&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;// temos a função "sum", uma função que a soma de dois números&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// na minha visão, existem duas formas básicas&lt;/span&gt;
&lt;span class="c1"&gt;// que podemos usar pra implementar dummies&lt;/span&gt;

&lt;span class="c1"&gt;// criar uma lista de parâmetros para serem passados&lt;/span&gt;
&lt;span class="c1"&gt;// pra uma função específica&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sumDummies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;// OU&lt;/span&gt;

&lt;span class="c1"&gt;// criar os dummies baseados nos tipos&lt;/span&gt;
&lt;span class="c1"&gt;// se eu tenho um tipo number, então terei um dummy pra números&lt;/span&gt;
&lt;span class="c1"&gt;// e em todos os lugares onde for necessário passar números&lt;/span&gt;
&lt;span class="c1"&gt;// como parametros, utilizaremos o mesmo dummy&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;numberDummy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Fakes
&lt;/h5&gt;

&lt;p&gt;Fakes são objetos com implementações funcionais que geralmente são utilizados como dependências de alguma unidade sendo testada. Vamos para o exemplo mais comum de fake, uma implementação de banco de dados em memória&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;// imagine que temos uma service que precisa acessar uma implementação&lt;/span&gt;
&lt;span class="c1"&gt;// de banco de dados que tenha os métodos count, save e find&lt;/span&gt;
&lt;span class="c1"&gt;// criaremos uma implementação falsa, que implemente esses&lt;/span&gt;
&lt;span class="c1"&gt;// métodos, para poder simular o funcionamento do sistema&lt;/span&gt;
&lt;span class="c1"&gt;// sem ter o banco de dados de pé&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;FakeDatabase&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

  &lt;span class="nx"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// essa implementação, mesmo com sua simplicidade, consegue simular&lt;/span&gt;
&lt;span class="c1"&gt;// o comportamento de uma service que faz algo no banco de dados.&lt;/span&gt;
&lt;span class="c1"&gt;// utilizando essa implementação seria possível fazer os testes&lt;/span&gt;
&lt;span class="c1"&gt;// necessários sem precisar subir a instância do banco e podendo&lt;/span&gt;
&lt;span class="c1"&gt;// ainda assim dar um "count" nos dados salvos, ou até mesmo buscar&lt;/span&gt;
&lt;span class="c1"&gt;// uma informação salva previamente&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Stubs
&lt;/h5&gt;

&lt;p&gt;Assim como o fake, a função do stub também é substituir implementações reais pro testes ser rodado. A diferença é que ele não tem complexidade alguma, é só uma função falsa que retorna um valor específico, independente dos parâmetros passados pra ela&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;// para esse exemplo, usaremos o método proxy novamente...&lt;/span&gt;
&lt;span class="c1"&gt;// imagine que queremos testar o método proxy, e ter certeza que o&lt;/span&gt;
&lt;span class="c1"&gt;// que ele retorna é a mesma coisa que o método passado pra ele retorna&lt;/span&gt;
&lt;span class="c1"&gt;// o que podemos fazer, é criar um método falso que tem um valor&lt;/span&gt;
&lt;span class="c1"&gt;// de retorno padrão&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sumStub&lt;/span&gt; &lt;span class="o"&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="mi"&gt;5&lt;/span&gt;

&lt;span class="c1"&gt;// o método "sumStub", poderia substituir o método "sum" numa injeção&lt;/span&gt;
&lt;span class="c1"&gt;// de dependência, mas ele não se preocupa com o valor recebido, ele&lt;/span&gt;
&lt;span class="c1"&gt;// apenas retorna o valor que decidirmos ser relevante praquele caso de&lt;/span&gt;
&lt;span class="c1"&gt;// teste específico&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Spies
&lt;/h5&gt;

&lt;p&gt;Podemos dizer que o spy é um "stub com memória". Assim como o stub, ele tem o retorno de um valor pré-programado, mas ele também guarda as informações de como ele foi chamado, quantas vezes foi chamado, etc&lt;/p&gt;

&lt;p&gt;Geralmente são utilizadas bibliotecas pra criar spies, então vou deixar o link de exemplos de implementação das libs que utilizo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jestjs.io/docs/jest-object#jestspyonobject-methodname"&gt;Jest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sinonjs.org/releases/latest/spy-call/"&gt;Sinon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Mocks
&lt;/h5&gt;

&lt;p&gt;São objetos que além de terem um retorno pré-programado, tem também suas chamadas pré-programadas. Então ao contrário do stub, que não se importa em como você o chama ou quais parâmetros passa, o mock também checa se você está passando os valores certos pra receber aquele retorno esperado.&lt;/p&gt;

&lt;h4&gt;
  
  
  Mocks e stubs são iguais?
&lt;/h4&gt;

&lt;p&gt;Já dizia &lt;a href="https://martinfowler.com"&gt;Martin Fowler&lt;/a&gt;: &lt;a href="https://martinfowler.com/articles/mocksArentStubs.html"&gt;Mocks &lt;strong&gt;não são&lt;/strong&gt; stubs&lt;/a&gt;, porque enquanto stubs têm apenas retornos pré-programados, que serão retornados independente dos parâmetros recebidos, mocks são objetos com uma expectativa em relação aos argumentos que receberá.&lt;/p&gt;

&lt;p&gt;Infelizmente o &lt;a href="https://jestjs.io/pt-BR/"&gt;Jest&lt;/a&gt; (biblioteca de testes criada pelo Facebook e uma das mais utilizadas em ambientes JavaScript), não implementa mocks, então nesse exemplo vamos usar o &lt;a href="https://sinonjs.org/"&gt;sinon.js&lt;/a&gt; para exemplificar a diferença entre um e outro.&lt;/p&gt;

&lt;p&gt;Para este exemplo, usaremos o método proxy novamente&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;proxy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos testar o método proxy agora&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Primeiro, injetando o um stub como método&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addStub&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sinon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;add&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;sinon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;calledOnceWithExactly&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;addStub&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;sinon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;match&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="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Agora, o mesmo caso de uso implementado utilizando mock&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sinon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addMock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;expects&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;add&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;withExactArgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;addMock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nx"&gt;sinon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;match&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="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A diferença entre o mock e o stub, é o fluxo de teste deles. Enquanto o fluxo do stub é &lt;code&gt;setup -&amp;gt; execute -&amp;gt; verify&lt;/code&gt;, o fluxo do mock é &lt;code&gt;setup (object) -&amp;gt; setup (expectations) -&amp;gt; execute -&amp;gt; verify (mock) -&amp;gt; verify (spies, stubs, anything that isn't a mock)&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como organizar meus testes?
&lt;/h3&gt;

&lt;p&gt;Provavelmente existem muitas formas de fazer isso, mas a que mais me agrada e a que utilizo no dia-a-dia, é a metodologia "Triple A", ou "AAA". Os três As significam:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Arrange&lt;/li&gt;
&lt;li&gt;Act&lt;/li&gt;
&lt;li&gt;Assert&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Primeiro, você faz o "Arrange", ou seja, você prepara tudo pra que seu teste seja bem sucedido. Você utiliza esse espaço para criar variáveis, crias instâncias, spies, etc.&lt;/p&gt;

&lt;p&gt;O segundo passo, é o "Act", ou seja, agir/executar. É onde você executa as funções e utiliza os gatilhos para testar aquele caso específico.&lt;/p&gt;

&lt;p&gt;Terceiro passo, "Assert", ou seja, é o momento onde você vai validar que o comportamento foi de fato o que você esperava. É onde você valida se as funções corretas forma chamados com os parâmetros corretos, se o retorno do método testado foi o que você esperava, verifica os mocks, etc.&lt;/p&gt;

&lt;p&gt;O que mais me atrai no "Triple A", é que é uma forma simples, organizada e intuitiva de escrever os testes. Se tranquilize se não conseguir fazer dessa forma logo no início, o que importa é tentar se habituar. Uma coisa que fiz muito para iniciar, foi criar comentários. Sempre que escrevia um caso de teste, primeiro fazia isso:&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;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;example case&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="c1"&gt;// arrange&lt;/span&gt;

    &lt;span class="c1"&gt;// act&lt;/span&gt;

    &lt;span class="c1"&gt;// assert&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com esse pequeno trecho de código escrito, só você fazer as coisas na ordem. Primeiro você arranja tudo que precisa, depois executa, e depois verifica se tudo deu certo.&lt;/p&gt;

&lt;p&gt;Espero que essa metodologia possa te ajudar a escrever testes mais consistentes e claros!&lt;/p&gt;

&lt;p&gt;Caso tenha restado alguma dúvida, aqui vai o código que fizemos como exemplo para testar o stub com os comentários do AAA:&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;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;example case&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="c1"&gt;// arrange&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sinon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addMock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;expects&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;add&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;withExactArgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;// act&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;// assert&lt;/span&gt;
    &lt;span class="nx"&gt;addMock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nx"&gt;sinon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;match&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="mi"&gt;5&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;h3&gt;
  
  
  O que devemos testar?
&lt;/h3&gt;

&lt;p&gt;Uma das coisas que mais tive dificuldade quando iniciei com os testes unitários, foi saber o que é importante ser testado e o que não é. Ouvimos muito falar do famoso (e mítico) "100% de coverage", mas ter 100% de coverage não garante que sua aplicação vai funcionar corretamente em produção.&lt;/p&gt;

&lt;p&gt;Testes unitários são testes que garantem a confiabilidade das unidades do sistema, então o ideal, é que você aproveite os testes unitários para testar regras de negócio, coisas relevantes para o negócio.&lt;/p&gt;

&lt;p&gt;Imagine que a pessoa decide o que vai ser feito (seu chefe, o PO, seu tech lead, etc), te diz que você precisa criar uma rota de cadastro na API que já existe no sistema que você trabalha. O que você faz? Descobre como o sistema tem que se comportar na determinada situação. Aqui vão alguns exemplos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Existe uma idade mínima pros usuários serem cadastrados?&lt;/li&gt;
&lt;li&gt;Quais informações são necessárias para o cadastro do usuário?&lt;/li&gt;
&lt;li&gt;Em caso de informações vazias, como o sistema deve se comportar?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Geralmente, esses itens que falam sobre como o sistema tem que se comportar em qual situação, são chamados de "Regras de Negócio". As regras de negócio, são as regras que determinam como o sistema deve se comportar e agir em determinadas situações, testá-las é o que dá confiabilidade pro sistema que você desenvolve.&lt;/p&gt;

&lt;p&gt;Existe um ganho imenso quando o seu caso de teste é "should make xxx when xxx because of xxx" (imagine que esses "xxx" seriam as regras específicas de negócio que você está testando, por exemplo, que o usuário deve ter mais de 18 anos) ao invés de "should call method xxx". &lt;/p&gt;

&lt;p&gt;Uma curiosidade é que o ".spec" como sufixo de arquivos de testes em algumas libs de teste do javascript, vem da palavra "specification", ou seja, "especificação". O que isso pode nos ensinar? Que os testes unitários também podem servir como um tipo de especificação, ou documentação pra unidade do seu sistema!&lt;/p&gt;

&lt;p&gt;Quando estamos desenvolvendo, não é natural pensar "esse teste tem que explicar esse código", mas quando precisamos dar manutenção em um código, e os casos de teste descrevem não só o que o código faz, mas também o porquê ele faz.&lt;/p&gt;

&lt;p&gt;Testar as regras de negócio é um ótimo caminho pra escrever testes cada vez mais confiáveis. Quando você tem as regras de negócio testadas, se for necessária alguma manutenção ou refatoração no sistema, talvez exista alguma complexidade de código que exista ali e você já pense logo "meu deus, um for, vou remover isso agora e esse método vai ficar muito mais rápido!", mas o que não pensamos, é que 6 meses atrás, quando aquela função foi implementada, existia um requisito de que o sistema precisava precisava tratar as informações uma a uma, sequencialmente, porque pode existir algum sistema de outro time que precisa que as coisas funcionem dessa forma.&lt;/p&gt;

&lt;p&gt;Criar testes que validem o que é mais importante pro projeto (esse usuário tem todas as informações e dependencias necessarias para finalizar o cadastro? ele já é cadastrado no sistema? o e-mail foi enviado pra ele corretamente depois de salvá-lo no banco de dados?), e não apenas o que é importante pra implementação (chamar função x, receber parâmetro y), é uma das melhores formas de entregar valor pro seu projeto e pro seu time!&lt;/p&gt;

&lt;h2&gt;
  
  
  Agradecimentos
&lt;/h2&gt;

&lt;p&gt;Desenvolver isso foi de um ganho imenso pra mim, e espero que ler isso te traga esse ganho também!&lt;/p&gt;

&lt;p&gt;Obrigado por disponibilizar seu tempo pra prestigiar meu trabalho :)&lt;/p&gt;

&lt;p&gt;Se tiver alguma dúvida, sugestão, quiser me conhecer melhor ou criar uma conexão, sinta-se a vontade para me uma mensagem no &lt;a href="https://www.linkedin.com/in/wricke/"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UC9cOiXh-RFR7KI61KcyTb0g"&gt;Canal Otávio Lemos no Youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://martinfowler.com/articles/mocksArentStubs.html"&gt;Mocks aren't stubs - Martin Fowler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/trainingcenter/testes-unit%C3%A1rios-mocks-stubs-spies-e-todas-essas-palavras-dif%C3%ADceis-f2765ac87cc8"&gt;Testes Unitários 101: Mocks, Stubs, Spies e todas essas palavras difíceis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

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