vanderleipinto / test_app

0 stars 0 forks source link

feat: Factorybot Lint #33

Closed vanderleipinto closed 7 months ago

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