vanderleipinto / test_app

0 stars 0 forks source link

feat: Heranca #14

Closed vanderleipinto closed 7 months ago

vanderleipinto commented 7 months ago

Para esse exemplo vamos alterar o banco de dados usando o arquivo db/migrate/20240301131925_create_customers.rb

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.timestamps
    end
  end
end

Após essa alteração vamos apagar e recriar o banco de dados:

rails db:drop db:create db:migrate

Alterando o Factory

Alterando a factory para o model alterado:

FactoryBot.define do
  factory :customer, aliases: [:user, :worker] do
    name {Faker::Name.name}
    email {"beatriz@filha.com"}
    vip {true}
    days_to_pay {30}
  end
end

Agora podemos fazer o teste do novo model

require 'rails_helper'

RSpec.describe Customer, type: :model do
   it '#full_name' do
    customer = create(:customer, vip: false, days_to_pay: 10) 
    expect(customer.vip).to be_falsey
  end
end

Ou seja, alteramos o model para conter o vip e o days_to_pay, o que é um trabalho extra. Podemos usar então a herança para não ter que ficar alterando o model em todos os testes.

No arquivo spec/factories/customer.rb

FactoryBot.define do
  factory :customer, aliases: [:user, :worker] do
    name {Faker::Name.name}
    email {"beatriz@filha.com"}

    factory :customer_vip do
      vip {true}
      days_to_pay {30}
    end

    factory :customer_default do
      vip {false}
      days_to_pay {15}
    end
  end
end

Agora para fazer o teste fica da seguinte maneira:spec/models/customer_spec.rb

require 'rails_helper'

RSpec.describe Customer, type: :model do
  it '#full_name herança' do
    customer = create(:customer_vip) #usando a herança
    expect(customer.vip).to eq(true)
  end
end

Se utilizarmos somente o :customer, os dados de herança (vip e days_to_pay) não serão preenchidos.