vanderleipinto / test_app

0 stars 0 forks source link

Atributes For #15

Closed vanderleipinto closed 7 months ago

vanderleipinto commented 7 months ago

O método attributes_for no RSpec é usado para criar um hash de atributos de um modelo em vez de criar efetivamente um registro no banco de dados. Isso é útil em testes onde você precisa apenas dos atributos de um objeto de modelo, sem a necessidade de persistir esses dados no banco de dados.

Quando você usa attributes_for, o RSpec cria um hash com os atributos especificados, que pode ser usado para construir ou criar objetos de modelo em seus testes de forma mais eficiente.

Por exemplo, suponha que você tenha um modelo Customer com os atributos name e email, e você queira testar um controlador que cria um novo Customer. Em vez de usar create para criar um registro no banco de dados, você pode usar attributes_for para criar apenas um hash com os atributos:

attributes = attributes_for(:customer)

Este código irá gerar um hash com os atributos name e email de um Customer. Você pode então passar este hash para o método post (ou outro método HTTP, dependendo da ação do controlador que está sendo testada) como os parâmetros do objeto a ser criado, como este:

post :create, params: { customer: attributes }

Isso permite que você teste a criação de objetos de modelo no seu controlador sem a necessidade de persistir dados no banco de dados durante os testes, o que pode tornar os testes mais rápidos e mais isolados.

vanderleipinto commented 7 months ago

Temos a possibilidade de usar o create e o build para usar o model. O create salva no BD e o build cria somente o objeto.

customer = create(:customer) # ou
customer = build(:customer)

Mas além desses dois métodos temos o __attributes_for__ ,ele vai trazer apenas os atributos em um Hash dos elementos do model.

No teste:

require 'rails_helper'

RSpec.describe Customer, type: :model do

  it 'Usando o Attributes_for' do
    attrs = attributes_for(:customer)
    attrs1 = attributes_for(:customer_vip)
    attrs2 = attributes_for(:customer_default)
    p attrs #mostra a hash de atributos
    p attrs1
    p attrs2
    customer = Customer.build(attrs) 
    expect(customer.full_name).to start_with("Sr.")
  end
end