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.
Para esse exemplo vamos alterar o banco de dados usando o arquivo db/migrate/20240301131925_create_customers.rb
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:
Agora podemos fazer o teste do novo model
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
Agora para fazer o teste fica da seguinte maneira:spec/models/customer_spec.rb
Se utilizarmos somente o :customer, os dados de herança (vip e days_to_pay) não serão preenchidos.