vanderleipinto / test_app

0 stars 0 forks source link

Factorybot Lint #32

Closed vanderleipinto closed 7 months ago

vanderleipinto commented 7 months ago

O FactoryBot Lint é uma ferramenta integrada ao FactoryBot. Ela serve para analisar suas fábricas de teste e detectar potenciais problemas, similar a como um linter (verificador de qualidade de código) funciona no código regular.

O que o FactoryBot Lint faz

Benefícios

Como executar

  1. Garantir dependências: Assegure-se que o gems 'FactoryBot' e 'factory_bot_lint' estão instalados em seu Gemfile.
  2. Executar o comando: No seu terminal, execute o seguinte comandoodo diretório raiz do projeto:

    factory_bot lint

    Você pode especificar fábricas específicas ou verificar todo o conjunto.

Exemplo de output

Se houver algum problema ou possível melhoria, o FactoryBot Lint irá listar e sugerir as correções necessárias.

Dica extra:

Documentação oficial:

vanderleipinto commented 7 months ago

Para usar esse artifício, criaremos um novo campo no migrations de Customers.

class CreateCustomers < ActiveRecord::Migration[7.1]
  def change
    create_table :customers do |t|
      t.string :name
      t.string :email
      t.boolean :vip
      t.integer :days_to_pay
      t.string :gender
      t.string :adress

      t.timestamps
    end
  end
end

Agora faremos com que esse campo seja obrigatório em app/models/customer.rb

class Customer < ApplicationRecord
  has_many :orders

  validates :address, presence:true

  def full_name
    "Sr. #{name}"
  end
end

Reconfigurando o banco de dados.

rails db:drop db:create db:migrate

O testes feitos no rspec dependem muito dos campos que existem ou deixem de existir.

Então se fizermos os testes depois de adicionar address.

Adicionando um faker adress: spec/factories/customers.rb

address {Faker::Address.street_address}

O factorybot lint verifica as validações dos testes e avisa quando ocorre.

Para isso devem ser feitas alterações no arquivo spec/spec_helper.rb

RSpec.configure do |config|
...
config.before(:suite) do #verifica se está faltando alguma coisa nos models.
      FactoryBot.lint
    end
...
end

Dessa maneira se ocorrer o erro de faltar algum campo do model ele vai explicitar de uma maneira mais legível.

Exemplo de erro

Exemplo do erro quando suprimimos o campo address (#address {Faker::Address.street_address})

An error occurred in a `before(:suite)` hook.
Failure/Error: FactoryBot.lint

FactoryBot::InvalidFactoryError:
  The following factories are invalid:

  * customer - Validation failed: Address can't be blank (ActiveRecord::RecordInvalid)
  * customer_with_orders - Validation failed: Address can't be blank (ActiveRecord::RecordInvalid)
  * customer_male - Validation failed: Address can't be blank (ActiveRecord::RecordInvalid)
  * customer_female - Validation failed: Address can't be blank (ActiveRecord::RecordInvalid)
  * customer_vip - Validation failed: Address can't be blank (ActiveRecord::RecordInvalid)
  * customer_default - Validation failed: Address can't be blank (ActiveRecord::RecordInvalid)
...

# ./spec/spec_helper.rb:33:in `block (2 levels) in <main>'
# -e:1:in `<main>'

Finished in 0.23674 seconds (files took 0.17039 seconds to load)
0 examples, 0 failures, 1 error occurred outside of examples