<?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 Melo</title>
    <description>The latest articles on DEV Community by Paulo Melo (@peimelo).</description>
    <link>https://dev.to/peimelo</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%2F441951%2F4d4672a3-7d5c-4bf4-8745-6315f6d2563f.jpeg</url>
      <title>DEV Community: Paulo Melo</title>
      <link>https://dev.to/peimelo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/peimelo"/>
    <language>en</language>
    <item>
      <title>Como configurar ambiente de testes em Ruby on Rails com RSpec</title>
      <dc:creator>Paulo Melo</dc:creator>
      <pubDate>Wed, 21 Apr 2021 17:31:03 +0000</pubDate>
      <link>https://dev.to/peimelo/como-configurar-ambiente-de-testes-em-ruby-on-rails-com-rspec-2p60</link>
      <guid>https://dev.to/peimelo/como-configurar-ambiente-de-testes-em-ruby-on-rails-com-rspec-2p60</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Photo by &lt;a href="https://unsplash.com/photos/WC6MJ0kRzGw" rel="noopener noreferrer"&gt;David Travis&lt;/a&gt; on &lt;a href="https://unsplash.com" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Olá, nesse post eu vou mostrar como configurar o RSpec e demais gems para dar suporte a um ambiente de testes robusto no Ruby on Rails.&lt;/p&gt;

&lt;p&gt;Se quiser ver o resultado final das instalações com todos os testes criados, acesse o meu repositório:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/peimelo" rel="noopener noreferrer"&gt;
        peimelo
      &lt;/a&gt; / &lt;a href="https://github.com/peimelo/blog_api" rel="noopener noreferrer"&gt;
        blog_api
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Ruby on Rails 6 course as API showing authentication via devise_token_auth.
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Esse post serve para dar apoio ao meu curso de &lt;strong&gt;Ruby on Rails 6 - Autenticação via API&lt;/strong&gt;, que está disponível no YouTube:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/i6vul6MqylE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  Criando o projeto
&lt;/h1&gt;

&lt;p&gt;Vamos criar um novo projeto com banco de dados PostgreSQL e servindo como API (rode no Terminal):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rails new blog_api &lt;span class="nt"&gt;-d&lt;/span&gt; postgresql &lt;span class="nt"&gt;--api&lt;/span&gt; &lt;span class="nt"&gt;-T&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Flags:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-d postgresql&lt;/code&gt; configura o banco PostgreSQL, você pode omitir essa flag caso queira usar o SQLite, que é o banco padrão;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--api&lt;/code&gt; gera o projeto como API, se omitir essa flag será criado como MVC;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-T&lt;/code&gt; deixa de gerar os arquivos de testes padrão do Rails que é o Minitest. Caso você já tenha um projeto criado, pode apagar a pasta &lt;code&gt;test&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  Adicionando o RSpec
&lt;/h1&gt;

&lt;p&gt;O &lt;a href="https://github.com/rspec/rspec-rails" rel="noopener noreferrer"&gt;RSpec&lt;/a&gt; é uma opção ao Minitest que vem como padrão no Ruby on Rails. Ele é muito usado e oferece uma sintaxe de fácil compreensão.&lt;/p&gt;

&lt;p&gt;Vamos adicionar o &lt;a href="https://github.com/rspec/rspec-rails" rel="noopener noreferrer"&gt;RSpec&lt;/a&gt; via bundle (ao invés de editar diretamente o Gemfile), porque com esse comando ele adiciona a última versão da gem (rode no Terminal):&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;bundle add rspec-rails &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="s1"&gt;'development, test'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Agora rode o comando para criar os arquivos iniciais:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rails generate rspec:install
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Vamos atualizar o arquivo &lt;code&gt;.rspec&lt;/code&gt; para ficar dessa forma:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;--require spec_helper
--format documentation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Na primeira linha ele importa o arquivo &lt;code&gt;spec/spec_helper.rb&lt;/code&gt; nos testes e o outro comando ele exibe no terminal as mensagens dos testes dessa forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fh6m7crfwjbo55qgodbrk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fh6m7crfwjbo55qgodbrk.png" alt="Screen Shot 2021-04-18 at 10.01.15"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;ao invés de pontinhos por arquivo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F909ichidnh4b7awupi1e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F909ichidnh4b7awupi1e.png" alt="Screen Shot 2021-04-13 at 18.20.24"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Crie uma pasta chamada &lt;code&gt;support&lt;/code&gt; dentro da pasta &lt;code&gt;spec&lt;/code&gt;. Agora vamos no arquivo &lt;code&gt;spec/rails_helper.rb&lt;/code&gt; e &lt;strong&gt;descomente&lt;/strong&gt; a linha abaixo para que o &lt;a href="https://github.com/rspec/rspec-rails" rel="noopener noreferrer"&gt;RSpec&lt;/a&gt; importe tudo que estiver dentro da pasta &lt;code&gt;spec/support&lt;/code&gt; que vamos precisar mais abaixo nas gems &lt;a href="https://github.com/thoughtbot/factory_bot_rails" rel="noopener noreferrer"&gt;Factory Bot&lt;/a&gt; e &lt;a href="https://github.com/DatabaseCleaner/database_cleaner" rel="noopener noreferrer"&gt;Database Cleaner&lt;/a&gt;:&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="c1"&gt;# ... código existente&lt;/span&gt;

&lt;span class="no"&gt;Dir&lt;/span&gt;&lt;span class="p"&gt;[&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;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'spec'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'support'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'**'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'*.rb'&lt;/span&gt;&lt;span class="p"&gt;)].&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# ... código existente&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  Adicionando o SimpleCov
&lt;/h1&gt;

&lt;p&gt;O &lt;a href="https://github.com/simplecov-ruby/simplecov" rel="noopener noreferrer"&gt;SimpleCov&lt;/a&gt; mostra a cobertura de código dos nossos testes que é um indicador importante. Vamos adicionar também o &lt;code&gt;simplecov_json_formatter&lt;/code&gt;, pois vamos precisar dele para integrar o projeto ao site &lt;a href="https://codeclimate.com/" rel="noopener noreferrer"&gt;Code Climate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rode o comando para adicionar a gem:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;bundle add simplecov &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="s1"&gt;'test'&lt;/span&gt; &lt;span class="nt"&gt;--require&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;bundle add simplecov_json_formatter &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="s1"&gt;'test'&lt;/span&gt; &lt;span class="nt"&gt;--require&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Vamos configurá-lo no projeto, adicionando no início do arquivo &lt;code&gt;spec/rails_helper.rb&lt;/code&gt; o trecho de código abaixo:&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="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'spec_helper'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'simplecov'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'simplecov_json_formatter'&lt;/span&gt;

&lt;span class="no"&gt;SimpleCov&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;formatter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;SimpleCov&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Formatter&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;MultiFormatter&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="no"&gt;SimpleCov&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Formatter&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;JSONFormatter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="no"&gt;SimpleCov&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Formatter&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;HTMLFormatter&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="no"&gt;SimpleCov&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;add_group&lt;/span&gt; &lt;span class="s1"&gt;'Config'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'config'&lt;/span&gt;
  &lt;span class="n"&gt;add_group&lt;/span&gt; &lt;span class="s1"&gt;'Controllers'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'app/controllers'&lt;/span&gt;
  &lt;span class="n"&gt;add_group&lt;/span&gt; &lt;span class="s1"&gt;'Libs'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'lib'&lt;/span&gt;
  &lt;span class="n"&gt;add_group&lt;/span&gt; &lt;span class="s1"&gt;'Models'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'app/models'&lt;/span&gt;
  &lt;span class="n"&gt;add_group&lt;/span&gt; &lt;span class="s1"&gt;'Serializers'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'app/serializers'&lt;/span&gt;
  &lt;span class="n"&gt;add_group&lt;/span&gt; &lt;span class="s1"&gt;'Specs'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'spec'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# ... resto do código existente&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Aqui estamos fazendo o import e iniciando o &lt;a href="https://github.com/simplecov-ruby/simplecov" rel="noopener noreferrer"&gt;SimpleCov&lt;/a&gt;, porém eu defini grupos para melhorar a visualização do resultado por abas. Se você desejar poderá adicionar/remover grupos. O resultado final ficará parecido com isso:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fl2sjmeqcgxl6in2vusfd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fl2sjmeqcgxl6in2vusfd.png" alt="Screen Shot 2021-04-19 at 19.38.24"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Após rodarmos os testes o &lt;a href="https://github.com/simplecov-ruby/simplecov" rel="noopener noreferrer"&gt;SimpleCov&lt;/a&gt; irá gerar um relatório que ficará na pasta &lt;code&gt;coverage&lt;/code&gt; do nosso projeto, porém é desnecessário que ela esteja no controle de versão do GIT, por isso vamos adicionar uma linha no arquivo &lt;code&gt;.gitignore&lt;/code&gt; para ignorá-la:&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="c1"&gt;# ... código existente&lt;/span&gt;

&lt;span class="sr"&gt;/coverage
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  Adicionando o Shoulda Matchers
&lt;/h1&gt;

&lt;p&gt;O &lt;a href="https://github.com/thoughtbot/shoulda-matchers" rel="noopener noreferrer"&gt;Shoulda Matchers&lt;/a&gt; ajuda a fazer alguns testes em apenas uma linha para funcionalidades comuns, que se fossem escritas na mão seriam complexas e sujeitas a erro.&lt;/p&gt;

&lt;p&gt;Rode o comando abaixo para adicionar a gem para o group test:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;bundle add shoulda-matchers &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="s1"&gt;'test'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Adicione o código abaixo no final do arquivo &lt;code&gt;spec/rails_helpers.rb&lt;/code&gt; e antes do último &lt;code&gt;end&lt;/code&gt;:&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="c1"&gt;# ... código existente&lt;/span&gt;

  &lt;span class="no"&gt;Shoulda&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Matchers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;integrate&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test_framework&lt;/span&gt; &lt;span class="ss"&gt;:rspec&lt;/span&gt;
      &lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;library&lt;/span&gt; &lt;span class="ss"&gt;:rails&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;span class="c1"&gt;# último end do arquivo spec/rails_helpers.rb&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  Adicionando o Factory Bot
&lt;/h1&gt;

&lt;p&gt;O &lt;a href="https://github.com/thoughtbot/factory_bot_rails" rel="noopener noreferrer"&gt;Factory Bot&lt;/a&gt; facilita a fabricação de dados para testes, podendo ser usada para pegar os atributos com valores, criar uma nova instância ou mesmo salvar no banco de dados. Rode o comando para adicionar a gem:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;bundle add factory_bot_rails &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="s1"&gt;'development, test'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Agora vamos configurar a nossa suite de testes para adicionar os métodos do factory_bot, para isso crie um arquivo chamado  &lt;code&gt;spec/support/factory_bot.rb&lt;/code&gt; e cole nele o trecho abaixo:&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;configure&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include&lt;/span&gt; &lt;span class="no"&gt;FactoryBot&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Syntax&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Methods&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, ao invés de usarmos nos arquivos de teste o comando &lt;code&gt;FactoryBot.build :article&lt;/code&gt;, vamos usar apenas &lt;code&gt;build :article&lt;/code&gt;.&lt;/p&gt;
&lt;h1&gt;
  
  
  Adicionando o Faker
&lt;/h1&gt;

&lt;p&gt;O &lt;a href="https://github.com/faker-ruby/faker" rel="noopener noreferrer"&gt;Faker&lt;/a&gt; serve para gerar dados fictícios de diversos tipos. Rode o comando para instalar:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;bundle add faker &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="s1"&gt;'development, test'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  Adicionando o Database Cleaner
&lt;/h1&gt;

&lt;p&gt;O &lt;a href="https://github.com/DatabaseCleaner/database_cleaner" rel="noopener noreferrer"&gt;Database Cleaner&lt;/a&gt; apaga os registros do banco de dados de testes antes de rodar os testes. Para instalar:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;bundle add database_cleaner-active_record &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="s1"&gt;'test'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Agora vamos configurar a nossa suite de testes para adicionar os métodos do &lt;a href="https://github.com/DatabaseCleaner/database_cleaner" rel="noopener noreferrer"&gt;Database Cleaner&lt;/a&gt;, para isso crie o arquivo &lt;code&gt;spec/support/database_cleaner.rb&lt;/code&gt; e cole o trecho abaixo:&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;configure&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;before&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:suite&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="no"&gt;DatabaseCleaner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;:transaction&lt;/span&gt;
    &lt;span class="no"&gt;DatabaseCleaner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clean_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:truncation&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;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;around&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:each&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="no"&gt;DatabaseCleaner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cleaning&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&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;h1&gt;
  
  
  Organizando o Gemfile
&lt;/h1&gt;

&lt;p&gt;Como já adicionamos todas as gems necessárias, eu dou uma organizada no &lt;code&gt;Gemfile&lt;/code&gt; para cada uma ficar no seu próprio grupo. Conforme dito antes, eu uso o comando &lt;code&gt;bundle add&lt;/code&gt; para que ele adicione a versão da gem ao invés de ficar sem nada.&lt;/p&gt;

&lt;p&gt;Veja como fica a organização das gems no &lt;code&gt;Gemfile&lt;/code&gt;:&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="c1"&gt;# ... código existente&lt;/span&gt;

&lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="ss"&gt;:development&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:test&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'byebug'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;platforms: &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:mri&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:mingw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:x64_mingw&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;"factory_bot_rails"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"~&amp;gt; 6.1"&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;"faker"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"~&amp;gt; 2.17"&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;"rspec-rails"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"~&amp;gt; 5.0"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="ss"&gt;:test&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;"database_cleaner-active_record"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"~&amp;gt; 2.0"&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;"shoulda-matchers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"~&amp;gt; 4.5"&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;"simplecov"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"~&amp;gt; 0.21.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;require: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# ... código existente&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Veja que retirei os trechos &lt;code&gt;:group =&amp;gt; :test&lt;/code&gt; e &lt;code&gt;:groups =&amp;gt; [:development, :test]&lt;/code&gt; após cada gem ficar no seu grupo.&lt;/p&gt;
&lt;h1&gt;
  
  
  Adicionando Helpers
&lt;/h1&gt;

&lt;p&gt;Podemos adicionar métodos para simplificar operações e evitar repetições. Tem um helper que eu uso que serve para acessar a resposta json nos meus testes de requests. &lt;/p&gt;

&lt;p&gt;Crie um arquivo chamado &lt;code&gt;spec/support/request_helpers.rb&lt;/code&gt; e adicione o conteúdo:&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="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Request&lt;/span&gt;
  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;JsonHelpers&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;json_response&lt;/span&gt;
      &lt;span class="vi"&gt;@json_response&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="no"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&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;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;symbolize_names: &lt;/span&gt;&lt;span class="kp"&gt;true&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;p&gt;Vamos alterar novamente o arquivo &lt;code&gt;spec/rails_helper.rb&lt;/code&gt; para adicionar depois do &lt;code&gt;end&lt;/code&gt; da configuração do &lt;code&gt;Shoulda::Matchers&lt;/code&gt; e antes do &lt;code&gt;end&lt;/code&gt; final do arquivo a informação para incluir o &lt;code&gt;Request::JsonHelpers&lt;/code&gt;:&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="c1"&gt;# ... código existente&lt;/span&gt;

  &lt;span class="no"&gt;Shoulda&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Matchers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;integrate&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test_framework&lt;/span&gt; &lt;span class="ss"&gt;:rspec&lt;/span&gt;
      &lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;library&lt;/span&gt; &lt;span class="ss"&gt;:rails&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Request&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;JsonHelpers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;type: :request&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="c1"&gt;# último end do arquivo spec/rails_helpers.rb&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Dessa forma, podemos usar o helper nos testes de request como no exemplo abaixo (veja no arquivo &lt;code&gt;spec/requests/api/v2/articles_spec.rb&lt;/code&gt; que se encontra no repositório de exemplo citado no início desse post):&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="c1"&gt;# ... código existente&lt;/span&gt;

  &lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s1"&gt;'GET /index'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="s1"&gt;'without logged user'&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;'renders two articles from distinct users'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="n"&gt;article&lt;/span&gt;
        &lt;span class="n"&gt;article_two&lt;/span&gt;

        &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;api_articles_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;headers: &lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="ss"&gt;as: :json&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;json_response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&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;eq&lt;/span&gt; &lt;span class="mi"&gt;2&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;span class="c1"&gt;# ... código existente&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  Integrando tudo
&lt;/h1&gt;

&lt;p&gt;Agora que tudo foi configurado, qualquer comando &lt;strong&gt;rails generate&lt;/strong&gt; irá criar o arquivo de testes correspondente.&lt;/p&gt;

&lt;p&gt;Vamos criar um CRUD de Articles para testar apenas o model como exemplo. Rode o comando:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rails g scaffold Article title:string body:text
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Caso você já tenha um projeto existente e está adicionando os testes nesse momento, segundo a documentação do &lt;a href="https://github.com/rspec/rspec-rails" rel="noopener noreferrer"&gt;RSpec&lt;/a&gt;, você pode rodar o comando abaixo para criar os arquivos de testes do model:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rails g rspec:model Article
      create  spec/models/article_spec.rb
      invoke  factory_bot
      create    spec/factories/articles.rb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Temos que rodar o migrate, tanto para &lt;code&gt;development&lt;/code&gt; quanto para &lt;code&gt;test&lt;/code&gt;, com os dois comandos:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rails db:migrate

&lt;span class="nv"&gt;$ &lt;/span&gt;rails db:migrate &lt;span class="nv"&gt;RAILS_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Geração de dados fictícios
&lt;/h2&gt;

&lt;p&gt;Vamos atualizar o arquivo que gera os dados de Article, edite o arquivo &lt;code&gt;spec/factories/articles.rb&lt;/code&gt;:&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;FactoryBot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;factory&lt;/span&gt; &lt;span class="ss"&gt;:article&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;Faker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Lorem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sentence&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;Faker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Lorem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;paragraph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;sentence_count: &lt;/span&gt;&lt;span class="mi"&gt;10&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Dessa forma o &lt;a href="https://github.com/thoughtbot/factory_bot_rails" rel="noopener noreferrer"&gt;Factory Bot&lt;/a&gt; e &lt;a href="https://github.com/faker-ruby/faker" rel="noopener noreferrer"&gt;Faker&lt;/a&gt; irão gerar dados fictícios e aleatórios para serem testados quando forem solicitados.&lt;/p&gt;
&lt;h2&gt;
  
  
  Testando o model Article
&lt;/h2&gt;

&lt;p&gt;Vamos atualizar o arquivo &lt;code&gt;app/models/article.rb&lt;/code&gt; para adicionar algumas validações:&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="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="p"&gt;,&lt;/span&gt;
                    &lt;span class="ss"&gt;length: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;minimum: &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="ss"&gt;uniqueness: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;case_sensitive: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:body&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="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Agora vamos criar nossos testes modificando o arquivo &lt;code&gt;spec/models/article_spec.rb&lt;/code&gt;:&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="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'rails_helper'&lt;/span&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;Article&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;type: :model&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;subject&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="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;build&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;describe&lt;/span&gt; &lt;span class="s1"&gt;'validations'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;validate_presence_of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;validate_presence_of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;validate_length_of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;is_at_least&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="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;validate_uniqueness_of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;case_insensitive&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Agora rode no terminal o comando &lt;code&gt;rspec&lt;/code&gt; e veja o resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F3tkyieqzfvqpe2a6ci7l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F3tkyieqzfvqpe2a6ci7l.png" alt="Screen Shot 2021-04-18 at 10.01.15"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Percebe que o &lt;a href="https://github.com/thoughtbot/shoulda-matchers" rel="noopener noreferrer"&gt;Shoulda Matchers&lt;/a&gt; adiciona o texto referente aos testes e cada teste fica com apenas 1 linha.&lt;/p&gt;

&lt;p&gt;Outro resultado do comando &lt;code&gt;rspec&lt;/code&gt; é que o &lt;a href="https://github.com/simplecov-ruby/simplecov" rel="noopener noreferrer"&gt;SimpleCov&lt;/a&gt; vai gerar o relatório de cobertura de testes em &lt;code&gt;coverage\index.html&lt;/code&gt;. Dê um duplo clique nesse arquivo no seu gerenciador de arquivos (Windows Explorer/Finder) e veja o resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fnafzzo2wi60g4ac0e6nd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fnafzzo2wi60g4ac0e6nd.png" alt="Screen Shot 2021-04-19 at 19.41.01"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Bônus: Teste de integração via GitHub Actions
&lt;/h1&gt;

&lt;p&gt;Eu comecei a usar o &lt;a href="https://docs.github.com/pt/actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt; ao invés do &lt;a href="https://circleci.com" rel="noopener noreferrer"&gt;CircleCI&lt;/a&gt; para rodar meus testes antes de fazer o deploy no &lt;a href="https://www.heroku.com" rel="noopener noreferrer"&gt;Heroku&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Crie o arquivo &lt;code&gt;config/database.ci.yml&lt;/code&gt; e cole nele o conteúdo abaixo:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Agora crie as pastas e arquivo &lt;code&gt;.github/workflows/ruby.yml&lt;/code&gt; e cole nele o conteúdo abaixo:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Verifique e altere, caso necessário, o nome do seu branch no GitHub e a versão do seu Ruby no arquivo &lt;code&gt;.github/workflows/ruby.yml&lt;/code&gt;:&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="c1"&gt;# ... código existente&lt;/span&gt;

&lt;span class="ss"&gt;on:
  push:
    branches: &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# &amp;lt;= AQUI&lt;/span&gt;
  &lt;span class="ss"&gt;pull_request:
    branches: &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# &amp;lt;= AQUI&lt;/span&gt;

&lt;span class="c1"&gt;# ... código existente&lt;/span&gt;

      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="no"&gt;Setup&lt;/span&gt; &lt;span class="no"&gt;Ruby&lt;/span&gt;
        &lt;span class="ss"&gt;uses: &lt;/span&gt;&lt;span class="n"&gt;ruby&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ruby&lt;/span&gt;&lt;span class="vi"&gt;@v1&lt;/span&gt;
        &lt;span class="ss"&gt;with:
          &lt;/span&gt;&lt;span class="n"&gt;ruby&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;version: &lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="c1"&gt;# &amp;lt;= AQUI&lt;/span&gt;
          &lt;span class="n"&gt;bundler&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;cache: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;

&lt;span class="c1"&gt;# ... código existente&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De agora em diante, ao fazer um push para o GitHub, seu testes irão rodar também no Actions:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F2pb1sue42yh6w349p6in.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F2pb1sue42yh6w349p6in.png" alt="Screen Shot 2021-04-20 at 06.39.45"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E se tudo ocorrer com sucesso, o deploy será realizado no Heroku, porque eu deixei marcada a opção de &lt;strong&gt;Wait for CI to pass before deploy&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fmudsabmaatn8rq09g8ax.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fmudsabmaatn8rq09g8ax.png" alt="Screen Shot 2021-04-20 at 06.51.00"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Eu gravei um vídeo sobre isso explicando em detalhes:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/XFZRNNu5z6E"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

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

&lt;p&gt;Se você chegou até aqui eu te agradeço e parabenizo, porque dessa forma você configurou seu projeto Ruby on Rails para ser seguro e confiante, porque testes são indispensáveis.&lt;/p&gt;

&lt;p&gt;Espero que tenham gostado. Um forte abraço.&lt;/p&gt;

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