vanderleipinto / test_app

0 stars 0 forks source link

Atributo Transitório #16

Closed vanderleipinto closed 7 months ago

vanderleipinto commented 7 months ago

Transient attributes, em um contexto de testes com o FactoryBot (anteriormente conhecido como FactoryGirl), são atributos temporários que podem ser definidos em uma fábrica, mas não são persistidos no banco de dados ao criar um objeto de modelo.

Esses atributos transientes são úteis quando você precisa fornecer valores temporários ou calculados apenas para fins de teste, mas que não devem ser armazenados no banco de dados. Por exemplo, você pode ter um modelo Customer com um atributo full_name, que é uma concatenação dos atributos first_name e last_name. Se você quiser testar algum comportamento que envolva full_name, mas não precisa realmente persistir esse valor no banco de dados, você pode definir full_name como um atributo transitório.

No FactoryBot, você pode definir atributos transitórios usando o método transient dentro da definição de fábrica. Por exemplo:

FactoryBot.define do
  factory :customer do
    first_name { "John" }
    last_name { "Doe" }

    transient do
      full_name { "#{first_name} #{last_name}" }
    end
  end
end

Dessa forma, full_name é um atributo transitório e não será persistido no banco de dados quando você criar um objeto Customer. Você pode acessar e usar esse atributo transitório em seus testes, mas ele não será armazenado no banco de dados.

Essa funcionalidade é útil para situações em que você precisa fornecer valores temporários ou calculados apenas para os propósitos dos testes, sem a necessidade de persisti-los no banco de dados.

vanderleipinto commented 7 months ago

Criamos um atributo transitório em spec/factories/customer.rb onde o valor upcased pode ser mudado na criação do objeto. Ex: customer = create(:customer, upcased: true)

transient do
      upcased  {false} 
    end

no final da factory criamos um after(:create) para executar verificações depois da criação:

after(:create) do |customer, evaluator| 
      customer.name.upcase! if evaluator.upcased 
    end

Executa essa ação após criar o objeto e transforma em maiúsculo se upcased == true.

No teste spec/models/customer_spec.rb

require 'rails_helper'

RSpec.describe Customer, type: :model do

   it 'Usando o Attributos Transitórios' do

    customer = create(:customer, upcased: true)

    expect(customer.name).to eq(customer.name.upcase)
  end
end

OBS: Se usarmos o attrs = attributes_for(:customer) para pegar os atributos, ele não vai contemplar o atributo transitório.