<?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: Paulo Castro</title>
    <description>The latest articles on DEV Community by Paulo Castro (@cyytrus).</description>
    <link>https://dev.to/cyytrus</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%2F756868%2F38b953ec-2238-4dbb-a033-2ef9dd029b7f.png</url>
      <title>DEV Community: Paulo Castro</title>
      <link>https://dev.to/cyytrus</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cyytrus"/>
    <language>en</language>
    <item>
      <title>Elixir Roadmap</title>
      <dc:creator>Paulo Castro</dc:creator>
      <pubDate>Fri, 22 Apr 2022 17:20:52 +0000</pubDate>
      <link>https://dev.to/cyytrus/elixir-roadmap-jfh</link>
      <guid>https://dev.to/cyytrus/elixir-roadmap-jfh</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Muitas pessoas da rede social do passarinho azul (essa mesma que você imaginou) me procuraram para saber um bom roadmap de estudos em Elixir, e bem, eu não sou a maior referência da área, mas creio que posso guiar com clareza qualquer um que queira aprender sobre essa linguagem maravilhosa. Dito isso, resolvi juntar todo o conteúdo que mapeei e filtrei para o melhor aprendizado em Elixir dada a minha experiência estudando-os. Dessa forma, só apresentarei conteúdos que &lt;strong&gt;&lt;em&gt;ESTUDEI&lt;/em&gt;&lt;/strong&gt; e que me ajudaram a entender melhor a linguagem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Parte 1 - Entendendo o básico
&lt;/h3&gt;

&lt;p&gt;A primeira parte para um bom estudo, independentemente da linguagem, são as bases, entender concisamente os tipos básicos, operadores, funções, sintaxe e afins é de suma importância. Dessa forma, nada melhor do que aprender isso logo de cara pela &lt;a href="https://elixir-lang.org/getting-started/introduction.html" rel="noopener noreferrer"&gt;documentação da linguagem&lt;/a&gt;. Nela você já terá acesso à aba &lt;code&gt;GUIDES&lt;/code&gt;, com um guia bem entendível dos principais elementos que formam a linguagem Elixir. No entanto, caso queira algo mais tátil, visual e direto ao ponto, é possível estudar todos esses conteúdos por meio do &lt;a href="https://elixirschool.com/en" rel="noopener noreferrer"&gt;ElixirSchool&lt;/a&gt;. Assim, se estudadas a sério, suas bases teóricas serão excelentes para um bom entendimento da linguagem.&lt;/p&gt;

&lt;p&gt;E caso você goste de cursos em vídeo, é possível complementar os estudos por eles, no YouTube e na Udemy você encontra alguns canais ensinando Elixir com uma didática excelente, sendo eles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.udemy.com/course/elixir-e-phoenix-do-zero/" rel="noopener noreferrer"&gt;Rafael Camarda - Udemy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/c/ELLYACADEMY/videos" rel="noopener noreferrer"&gt;Elly Academy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/c/AdolfoNeto" rel="noopener noreferrer"&gt;Canal do Professor Adolfo Neto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=WRGvPgCHMfI&amp;amp;list=PLv3nyCBtlWP8I9rknIrfcJWrO05yEzknD" rel="noopener noreferrer"&gt;Alquimia Stone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/c/elxproBR" rel="noopener noreferrer"&gt;ElxPro&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  E Sobre a prática?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Para praticar os tipos básicos e operações, aí vai uma opinião &lt;strong&gt;&lt;em&gt;MINHA&lt;/em&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utilizar o &lt;strong&gt;iex:&lt;/strong&gt; Eu sempre apoiei o começo dos estudos sobre a linguagem por meio da ferramenta iex, que já vem instalada com o Elixir, a mesma possibilita ao desenvolvedor criar funções, operações e manipular diversos elementos da linguagem sem ter que abrir uma IDE, fazendo tudo pelo terminal. Desse modo, eu incentivo imensamente o uso dela para o maior costume de testar as coisas em um ambiente seguro e prático.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;MUITOS EXERCÍCIOS:&lt;/em&gt;&lt;/strong&gt; Hoje, não vejo um site mais completo para praticar Elixir que não o &lt;a href="https://exercism.org/dashboard" rel="noopener noreferrer"&gt;Exercism&lt;/a&gt;. Os desafios nele contidos te permitem explorar as mais diversas formas de resolução e manipulação de dados, e em contextos divertidos, sem contar a ferramenta incrível de mentoria em que o estudante pode solicitar de forma &lt;strong&gt;&lt;em&gt;GRATUITA&lt;/em&gt;&lt;/strong&gt; na plataforma, onde alguém mais experiente pode ajudar.&lt;/li&gt;
&lt;li&gt;Projetos simples: começar com projetos simples sempre é uma boa escolha, criar um módulo com funções que manipulam as estruturas de dados do Elixir, interagem com a criação e manipulação de arquivos, etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Parte 2 - Conhecendo ferramentas e libs
&lt;/h3&gt;

&lt;p&gt;Após um bom estudo do básico da linguagem, creio que o próximo passo seria entender o &lt;a href="https://elixir-lang.org/getting-started/mix-otp/introduction-to-mix.html" rel="noopener noreferrer"&gt;mix&lt;/a&gt;, uma das principais ferramentas do Elixir, a partir dela é possível criar um conjunto de diretórios que permitem uma excelente estruturação do código, juntamente com exemplos de testes, libs e etc...&lt;/p&gt;

&lt;p&gt;Você também pode acessar um conteúdo de ótima qualidade no &lt;a href="https://elixirschool.com/en/lessons/basics/mix" rel="noopener noreferrer"&gt;ElixirSchool&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Praticas com o Mix:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Aqui vão algumas sugestões para se praticar no mix:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aplicação de libs (credo, oban, plugcowboy, money, etc.).&lt;/li&gt;
&lt;li&gt;Criação de Plugs (Caso não saiba o que raios são Plugs em Elixir, recomendo o meu &lt;a href="https://dev.to/cyytrus/entendendo-plugs-em-elixir-469c"&gt;Post&lt;/a&gt; sobre).&lt;/li&gt;
&lt;li&gt;Testes unitários com ExUnit e uma introdução ao TDD utilizando a lib mix-testwatch.&lt;/li&gt;
&lt;li&gt;Primeiro CRUD com Ecto.&lt;/li&gt;
&lt;li&gt;Criação de um projeto de gastos financeiros (CLI ou utilizando alguma lib para ter componentes visuais)&lt;/li&gt;
&lt;li&gt;Criação de um projeto simulando um banco (Contas, transferencias, saques, depósitos)&lt;/li&gt;
&lt;li&gt;Criar um mini RPG com personagens, habilidades, etc...&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Parte 3 - Conhecendo o Framework Web Phoenix
&lt;/h3&gt;

&lt;p&gt;Com uma boa base das partes 1 e 2, já é possível introduzir o framework &lt;a href="https://phoenixframework.org/" rel="noopener noreferrer"&gt;Phoenix&lt;/a&gt;, e você pode aprender a base diretamente na &lt;a href="https://hexdocs.pm/phoenix/up_and_running.html" rel="noopener noreferrer"&gt;documentação&lt;/a&gt; do mesmo. Em contraposição à parte básica do Elixir, não se acha um bom conteúdo gratuito sobre phoenix (pelo menos eu não achei, então sinta-se à vontade para deixar nos comentátios sugesões de conteúdo para eu colocar aqui), somente alguns tutoriais no youtube. Dessa forma, fica a indicação do Elxpro acima citado como um conteúdo introdutório do phoenix, juntamente com o estudo da sua documentação.&lt;/p&gt;

&lt;h4&gt;
  
  
  Colocando em prática / ideias de projetos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A minha principal dica para se estudar o framework é fazendo projetos reais, tais como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consumo de API's de terceiros (ViaCep, Riotgames, Github)&lt;/li&gt;
&lt;li&gt;Criação de usuários&lt;/li&gt;
&lt;li&gt;Criação e autenticação de tokens com a lib Guardian&lt;/li&gt;
&lt;li&gt;Desenvolvimento de alguma API que interage com algum valor monetário (Controle de gastos, Simulação de banco, etc...)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Parte extra - Mapa visual e conclusão
&lt;/h3&gt;

&lt;p&gt;Abaixo temos um bom resumão do que é MUITO interessante estudar caso queira conhecer e utilizar Elixir no dia-a-dia, e lembrando, esse artigo foi escrito com base nas minhas experiências e conteúdos gratuitos de ensino que encontrei na internet, mas para o meu estudo, também utilizei livros e alguns cursos da udemy (todos pagos).&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%2Fyx08mqoc7oojuvwp12ng.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%2Fyx08mqoc7oojuvwp12ng.png" alt="Image description" width="800" height="1457"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>elixir</category>
    </item>
    <item>
      <title>Entendendo Plugs em Elixir</title>
      <dc:creator>Paulo Castro</dc:creator>
      <pubDate>Mon, 18 Apr 2022 14:28:10 +0000</pubDate>
      <link>https://dev.to/cyytrus/entendendo-plugs-em-elixir-469c</link>
      <guid>https://dev.to/cyytrus/entendendo-plugs-em-elixir-469c</guid>
      <description>&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;A motivação do Artigo veio através de uma dificuldade que tive estudando Plugs em Elixir, o conteúdo não exemplificava e/ou explicava muito bem o funcionamento desse tipo de componente, e após muito estudo consegui uma forma interessante para entender tudo isso, e nada melhor do que compartilhar esse estudo!&lt;/p&gt;

&lt;p&gt;Dessa forma, artigo de hoje tem o intuito de explicar o funcionamento dos Plugs em Elixir por meio das seguintes etapas abaixo. No entanto, é de &lt;strong&gt;&lt;em&gt;SUMA&lt;/em&gt;&lt;/strong&gt; importância que você tenha conhecimento do &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Overview" rel="noopener noreferrer"&gt;protocolo HTTP e do ciclo de vida das requisições&lt;/a&gt;, pois isso não será abordado no texto abaixo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Middlewares: Um breve resumo&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tipos comuns de middlewares utilizados em Elixir&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Plugs em Elixir!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Elementos e caminhos de um Plug&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Tipos de Plugs em Elixir&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Function Plugs&lt;/li&gt;
&lt;li&gt;Module Plugs&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Plug Pipelines&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;

&lt;h2&gt;
  
  
  1 - Middlewares: Um breve resumo
&lt;/h2&gt;

&lt;p&gt;Middleware é um tipo de software que gerencia dados e informações de um determinado tipo de aplicação, seja ela um sistema de mensageria, autenticação, API, dentre outros. Dessa forma, o middleware atua como uma &lt;strong&gt;&lt;em&gt;"ponte"&lt;/em&gt;&lt;/strong&gt; entre os processos do software, possibilitando a criação de aplicações mais legíveis e eficientes, uma vez que o desenvolvedor entenda todos os processos de seu middleware, onde as conexões e dados do usuário final sejam tratadas de forma integral e legível pelo programa.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1 - Tipos comuns de middlewares utilizados em Elixir
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Integração abrangente:&lt;/em&gt;&lt;/strong&gt; Esse middleware possibilita conectar sistemas internos e externos da aplicação, facilitando a tratativa dos dados recebidos, temos como exemplo uma linha de autenticação por token, onde o usuário envia a primeira requisição com seus dados e em seguida ganha um &lt;strong&gt;&lt;em&gt;"Token"&lt;/em&gt;&lt;/strong&gt; para continuar navegando em outras áreas de um determinado site. Em elixir temos libs que disponibilizam plugs para isso.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;API's:&lt;/em&gt;&lt;/strong&gt; As nossas boas e velhas APi's também são tipos de middlewares, uma vez que as mesmas também podem ser ferramentas integradas por meio de protocolos, transmitindo e/ou tratando dados para uma aplicação e podendo conectar os produtos e serviços de um software.&lt;/p&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%2F2xf7tcw15zh8c5gwas3x.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%2F2xf7tcw15zh8c5gwas3x.png" alt="Elixir-plug-example" width="567" height="143"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2 - Plugs em Elixir!
&lt;/h2&gt;

&lt;p&gt;Em Elixir, o Plug é o que possibilita diferentes frameworks se comunicarem com diferentes servidores na VM do Erlang, atuando como um &lt;strong&gt;&lt;em&gt;Middleware&lt;/em&gt;&lt;/strong&gt;. Entender os Plugs é algo vital para um bom desenvolvedor Elixir, uma vez que grande parte do ecossistema de uma aplicação e seus frameworks é feita por meio de Plugs. &lt;/p&gt;

&lt;p&gt;Os Plugs vão interagir em todas as etapas de uma aplicação, sejam elas &lt;em&gt;controllers, endpoints ou routers&lt;/em&gt;, e internamente, todos são plugs.&lt;/p&gt;

&lt;p&gt;A intenção principal de um Plug é unificar o conceito de &lt;strong&gt;&lt;em&gt;"Connection"&lt;/em&gt;&lt;/strong&gt; (isso não será traduzido, pois, será tratado como elementos e parâmetros em Elixir, e é uma convenção abreviar tal parâmetro) ou &lt;strong&gt;&lt;em&gt;"Conn"&lt;/em&gt;&lt;/strong&gt;. Dessa forma, o Plug difere-se de outros middlewares que utilizam desse mesmo sistema de Connections, pois internamente ele não separa a requisição da resposta.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 - Elementos e caminhos de um Plug
&lt;/h3&gt;

&lt;p&gt;É possível pensar em um Plug como um trecho do código que recebe uma estrutura de dados, transforma-a e retorna a mesma estrutura, porém, com algum tipo de transformação. A estrutura principal recebida pelo Plug é a &lt;strong&gt;&lt;em&gt;"Connection"&lt;/em&gt;&lt;/strong&gt;, que representa tudo em uma requisição.&lt;/p&gt;

&lt;p&gt;Desse modo, ao receber a Connection por meio da estrutura de dados &lt;strong&gt;&lt;em&gt;%{} - "struct"&lt;/em&gt;&lt;/strong&gt;, a mesma será transformada progressivamente por meio do que chamamos de &lt;strong&gt;&lt;em&gt;"Plug pipeline"&lt;/em&gt;&lt;/strong&gt; até a resposta final que precisamos.&lt;/p&gt;

&lt;p&gt;Essa Connection que utilizaremos sempre é chamada de %Plug.Conn{}, uma struct onde armazenaremos as informações da nossa requisição, você pode consultar a documentação da mesma &lt;a href="https://hexdocs.pm/plug/Plug.Conn.html" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3 - Tipos de Plugs em Elixir
&lt;/h2&gt;

&lt;p&gt;Em seu nível mais simples, os Plugs dividem-se em duas formas: &lt;strong&gt;&lt;em&gt;Function Plugs e Module Plugs.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 - Function Plugs
&lt;/h3&gt;

&lt;p&gt;Para atuar como um Plug, uma função precisa de duas coisas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Aceitar uma &lt;em&gt;Connection struct&lt;/em&gt; ( &lt;strong&gt;%Plug.Conn{}&lt;/strong&gt; ).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Retornar uma Connection struct&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Toda função que receber e retornar tais parâmetros pode ser chamada &lt;strong&gt;Function plug.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Temos como exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;connection_example&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;conn&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Explicando o código:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Elementos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;conn: struct %Plug.Conn{}.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;_opts: abreviação para "options", como não será utilizada e, por convenção em elixir, é colocado um &lt;em&gt;underscore ( _ )&lt;/em&gt; para ignorar os valores.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Comportamento:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Receberá a connection e as options (que não utilizaremos).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.2 - Module Plugs
&lt;/h3&gt;

&lt;p&gt;É considerado &lt;strong&gt;&lt;em&gt;Module Plug&lt;/em&gt;&lt;/strong&gt; tudo aquilo que implementa as duas funções: &lt;strong&gt;&lt;em&gt;init/1 e call/2:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;PlugExample&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;opts&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Explicando o código:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Elementos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;função &lt;em&gt;init/1&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;função &lt;em&gt;call/2&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Comportamento:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;init receberá um parâmetro (options) e retornará o parâmetro recebido.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;call receberá dois parâmetros: a connection e as &lt;strong&gt;options&lt;/strong&gt; de &lt;em&gt;init/1&lt;/em&gt;, agilizando muito o processo de execução do programa.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Curiosidade: &lt;em&gt;init/1&lt;/em&gt; é executada enquanto o programa é compilado, enquanto &lt;em&gt;call/2&lt;/em&gt; acontece enquanto o programa está sendo executado.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Um exemplo&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Para não deixar esse artigo gigante, você pode consultar um exemplo funcional de um &lt;strong&gt;&lt;em&gt;MODULE PLUG&lt;/em&gt;&lt;/strong&gt; no meu &lt;a href="https://github.com/Cyytrus/plug-article" rel="noopener noreferrer"&gt;github&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Plug pipelines
&lt;/h2&gt;

&lt;p&gt;Os Plugs começam a tomar sentido quando começamos a utilizar pipelines, que nada mais é do que um jeito de aninhar os Plugs, cada um fazendo uma pequena tarefa, transformando os dados e mandando-os para o próximo Plug de forma &lt;strong&gt;&lt;em&gt;sequencial&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Tal coisa é muito utilizada no Phoenix, o framework para aplicações Web do Elixir, de modo que temos a seguinte pipeline como padrão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="ss"&gt;:browser&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;plug&lt;/span&gt; &lt;span class="ss"&gt;:accepts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"html"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="n"&gt;plug&lt;/span&gt; &lt;span class="ss"&gt;:fetch_session&lt;/span&gt;
  &lt;span class="n"&gt;plug&lt;/span&gt; &lt;span class="ss"&gt;:fetch_flash&lt;/span&gt;
  &lt;span class="n"&gt;plug&lt;/span&gt; &lt;span class="ss"&gt;:protect_from_forgery&lt;/span&gt;
  &lt;span class="n"&gt;plug&lt;/span&gt; &lt;span class="ss"&gt;:put_secure_browser_headers&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma, cada requisição terá como retorno uma Connection modificada, que será passada para outros plugs até chegarmos a uma resposta final.&lt;/p&gt;

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

&lt;p&gt;Com esse artigo, é possível entender o que é um middleware, Plugs em Elixir, Tipos de Plugs e Plug pipelines, não será possível, nessa ocasião, a construção de um Plug em Phoenix. No entanto, farei um artigo futuramente detalhando passo-a-passo a criação de um Plug desde o &lt;code&gt;mix phx.new&lt;/code&gt; até o término do código.&lt;/p&gt;

&lt;p&gt;No mais, espero que eu tenha conseguido clarear um pouco a ideia dos Plugs, e qualquer dúvida e/ou correções é possível me contatar no &lt;a href="https://twitter.com/Elixitrus" rel="noopener noreferrer"&gt;twitter&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>[PT-BR] - RSPEC &amp; RUBY - DO GO HORSE AO TDD</title>
      <dc:creator>Paulo Castro</dc:creator>
      <pubDate>Sat, 15 Jan 2022 20:09:52 +0000</pubDate>
      <link>https://dev.to/cyytrus/pt-br-rspec-ruby-do-go-horse-ao-tdd-10fh</link>
      <guid>https://dev.to/cyytrus/pt-br-rspec-ruby-do-go-horse-ao-tdd-10fh</guid>
      <description>&lt;h1&gt;
  
  
  &lt;strong&gt;Prólogo&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;O que você irá ler abaixo são apenas alguns dos vários motivos para se usar testes, especialmente desenvolver guiado por testes.&lt;/p&gt;

&lt;p&gt;Como um desenvolvedor iniciante, sempre questionei internamente os porquês dos testes, mesmo com todos ao meu redor dizendo sua importância e valor, nunca havia posto em prática as técnicas necessárias para executar bons testes e/ou desenvolver algo totalmente guiado por eles, antes a vida era bem simples, era só montar no cavalo e escrever tudo às cegas, sem planejamento, sem pensar, o belo &lt;strong&gt;e não ideal&lt;/strong&gt; eXtreme Go Horse. No entanto, com isso me vi perdendo produtividade, testar tudo de um código "na unha" se tornou cansativo demais, brechas e bugs apareciam com facilidade, foi nesse momento em que me dei conta, com a seguinte frase passando pela minha cabeça: "Se eu tivesse os testes escritos, tudo seria mais tranquilo". Dessa forma, com esse pensamento, tomei vergonha na cara e entrei a fundo naquilo que chamam de Test Driven Development, ou melhor, TDD.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Sobre o TDD:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Test Driven Development, ou comumente conhecido como TDD, é uma técnica de desenvolvimento em que o desenvolvedor primeiro pensa nas funções e/ou comportamentos do seu código, escreve os testes para só posteriormente escrever as linhas de código propriamente ditas. Sua importância se dá pela previsibilidade das funções definidas pelo teste, em que você arquiteta todo o código sabendo exatamente o que deve(ria) ser retornado. Desse modo, o TDD é formado pelos seguintes passos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;(RED)&lt;/strong&gt; Escrever um teste que falhe: Ao escrever o teste, ele obviamente irá falhar a priori, pois você não tem código nenhum para fazer o que o teste espera que seja feito.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;(GREEN)&lt;/strong&gt; Fazer o código funcionar: Ao escrever o código, o desenvolvedor deve fazer o possível para que o teste seja aceito, não importando como.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;(REFACTOR)&lt;/strong&gt; Eliminar a redundância: Após garantir o funcionamento do código, o desenvolvedor deverá aplicar ao máximo as boas práticas da linguagem, buscando sempre o equilíbrio entre legibilidade e qualidade.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conhecendo o RSpec:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Não vou entrar a fundo na instalação e afins pois esse não é o foco da postagem, mas &lt;a href="https://github.com/rspec/rspec-rails" rel="noopener noreferrer"&gt;aqui&lt;/a&gt; e &lt;a href="https://rspec.info/" rel="noopener noreferrer"&gt;aqui&lt;/a&gt; você encontrará tudo o que é preciso para entender e utilizar o RSpec com Ruby e Rails.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;RSpec&lt;/strong&gt; é uma ferramenta (&lt;em&gt;gem&lt;/em&gt;) de testes para códigos na linguagem &lt;strong&gt;Ruby&lt;/strong&gt;, sendo uma das mais famosas e geralmente acompanhado de outras &lt;strong&gt;gems&lt;/strong&gt; que amplificam sua utilidade, tais como: &lt;em&gt;Capybara&lt;/em&gt;, &lt;em&gt;Cocumber&lt;/em&gt; e &lt;em&gt;Factorybot&lt;/em&gt; (antigo FactoryGirl).&lt;/p&gt;

&lt;p&gt;Sua sintaxe simples e muito semelhante com a lingua inglesa auxília no entendimento e escrita de testes, geralmente com suas descrições feitas na terceira pessoa.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;RSpec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;describe&lt;/span&gt; &lt;span class="no"&gt;ArticlesController&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s1"&gt;'#index'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s1"&gt;'returns a success response'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s1"&gt;'/articles'&lt;/span&gt;
      &lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to&lt;/span&gt; &lt;span class="n"&gt;have_http_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s1"&gt;'returns articles in a proper order'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;older_article&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
        &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:article&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;created_at: &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ago&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;recent_article&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:article&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s1"&gt;'/articles'&lt;/span&gt;
      &lt;span class="n"&gt;ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;recent_article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;older_article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Entendendo o código:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;.describe:&lt;/em&gt;&lt;/strong&gt; Utiliza-se &lt;em&gt;describe&lt;/em&gt; para descrever as &lt;em&gt;classes&lt;/em&gt;, &lt;em&gt;módulos&lt;/em&gt; ou &lt;em&gt;métodos&lt;/em&gt; em que irão ser feitos os testes. Nesse caso o que está sendo descrito acima é a classe &lt;strong&gt;&lt;em&gt;ArticlesController.&lt;/em&gt;&lt;/strong&gt; e a chamada &lt;strong&gt;&lt;em&gt;index&lt;/em&gt;&lt;/strong&gt; da rota &lt;strong&gt;&lt;em&gt;/articles&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;it:&lt;/em&gt;&lt;/strong&gt; Utiliza-se &lt;em&gt;it&lt;/em&gt; para descrever o que será testado (descrito na terceira pessoa). Nesse caso &lt;em&gt;'Returns a success response'&lt;/em&gt; implica na requisição de &lt;strong&gt;&lt;em&gt;get '/articles'&lt;/em&gt;&lt;/strong&gt; retornar uma resposta "Sucesso", ou melhor, o &lt;strong&gt;status HTTP 200 (OK)&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O próximo passo, sob o viés do TDD, você deverá rodar o comando &lt;code&gt;rspec&lt;/code&gt; no seu terminal para iniciar o teste, que obviamente falhará, na maioria dos casos, a falha do teste te dará um norte sobre o que deve ser feito.&lt;/p&gt;

&lt;p&gt;Após isso, será iniciada a linha de pensamento para o código ser aceito pelo teste, nesse caso:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Exemplo do teste feito em uma API.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deverá existir um &lt;em&gt;Model&lt;/em&gt; e um &lt;em&gt;Controller&lt;/em&gt; para articles, juntamente com um Serializer (JSON API gem) para definir os atributos e organizá-los e um método index para renderizar o arquivo em formato .json&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="c1"&gt;#./app/models/article.rb&lt;/span&gt;

  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Article&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationRecord&lt;/span&gt;
    &lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;presence: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
    &lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;presence: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
    &lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:slug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;presence: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;uniqueness: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;

    &lt;span class="n"&gt;scope&lt;/span&gt; &lt;span class="ss"&gt;:recent&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="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;created_at: :desc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;# ./app/controllers/articles_controller.rb&lt;/span&gt;

  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ArticlesController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationController&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;
      &lt;span class="n"&gt;articles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recent&lt;/span&gt;
      &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;json: &lt;/span&gt;&lt;span class="n"&gt;serializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="ss"&gt;status: :ok&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;serializer&lt;/span&gt;
      &lt;span class="no"&gt;ArticleSerializer&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;# ./serializers/article_serializer.rb&lt;/span&gt;

  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ArticleSerializer&lt;/span&gt;
    &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;JSONAPI&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Serializer&lt;/span&gt;
    &lt;span class="n"&gt;attributes&lt;/span&gt; &lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:slug&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;O código deverá ter uma rota definida para o controller articles juntamente com o método index.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ./config/routes.rb&lt;/span&gt;
&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;draw&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
 &lt;span class="n"&gt;resources&lt;/span&gt; &lt;span class="ss"&gt;:articles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;only: &lt;/span&gt;&lt;span class="sx"&gt;%i[index]&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

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

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

&lt;p&gt;Fazendo isso e rodando novamente &lt;code&gt;rspec&lt;/code&gt; é esperado que o teste passe.&lt;/p&gt;

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

&lt;p&gt;Seguindo dois dos três passos do TDD, consegue-se chegar a um código que terá sempre testes que podem indicar seu funcionamento digitando um simples comando no terminal, o que por sua vez é muito útil caso o desenvolvedor queira seguir o terceiro passo do TDD e refatorar, melhorar e adicionar novas funcionalidades para sua aplicação / API. &lt;/p&gt;

&lt;p&gt;Sob essa ótica, o aumento da produtividade e qualidade de código será apenas questão de tempo, conforme o desenvolvedor aprende mais de suas ferramentas de teste, suas nuances e novas técnicas. &lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>tdd</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
