vanderleipinto / test_app

0 stars 0 forks source link

feat: has_many (rspec) #30

Closed vanderleipinto closed 7 months ago

vanderleipinto commented 7 months ago

Video

Para esta aula vamos adicionar has_many :orders ao model Customer

class Customer < ApplicationRecord
  has_many :orders
  def full_name
    "Sr. #{name}"
  end
end

Na factory criaremos mais um atribuno no transient chamado qtt_orders 3 (quantidade de orders 3)

   transient do
      upcased  {false} #valor que pode ser mudado na criação do objeto - customer = create(:customer, upcased: true)
      qtt_orders {3}
    end

E faremos um trait com um callback para criar uma lista de orders e inserir o transient no customer criado.

    trait :with_orders do
      after(:create) do |customer, evaluator|  
        create_list(:order, evaluator.qtt_orders, customer: customer)
      end 
    end

No teste fica assim:


  it 'has_many' do
    customer = create(:customer, :with_orders)
    puts customer.inspect
    puts customer.orders.inspect
    expect(customer.orders.count).to eq(3)
  end

também podemos sobrescrever a quantidade de orders:

customer = create(:customer, :with_orders, qtt_orders:15)
...
expect(customer.orders.count).to eq(15)

Também podemos criar um factory padrão de custumer_with_order:

factory :customer_with_orders, traits: [:with_orders]

E no teste fica assim:

customer2 = create(:customer_with_orders) #já cria com as 3 ordens padrão