Pular para o conteúdo principal

Fake (Dados de Teste)

O Nerdify inclui um sistema de geração de dados falsos integrado ao framework. Baseado na gem faker, ele cria automaticamente dados realistas para todos os campos definidos nos fieldsets.

⚠️ O módulo Faker não é carregado em produção por segurança.


⚙️ Métodos Disponíveis

Model.fake(attrs = {})

Cria uma instância com dados falsos e salva no banco:

customer = Customer.fake
# => #<Customer id: "...", name: "Maria Santos", email: "maria@example.com", ...>

customer.persisted? # => true

Model.new_fake(attrs = {})

Cria uma instância com dados falsos sem salvar:

customer = Customer.new_fake
# => #<Customer id: nil, name: "João Silva", email: "joao@example.com", ...>

customer.persisted? # => false
customer.valid? # => true (se dados forem válidos)
customer.save # Salva manualmente

🎯 Sobrescrevendo Valores

Passe um hash para definir valores específicos:

# Apenas nome fixo, resto é gerado
customer = Customer.fake(name: "Cliente Teste")

# Múltiplos campos fixos
customer = Customer.fake(
name: "Cliente VIP",
status: "active",
email: "vip@empresa.com"
)

📋 Geração por Tipo de Campo

O sistema gera dados apropriados para cada tipo:

Tipo do CampoDado GeradoExemplo
:text3 palavras aleatórias"Lorem ipsum dolor"
:textareaParágrafo completo"Lorem ipsum dolor sit amet..."
:numberInteiro 1-99942
:decimalDecimal 1-999.9156.78
:moneyValor monetárioMoney.new(15000)
:dateData atualDate.today
:date_timeData/hora atualTime.now
:timeHora atualTime.now
:booleantrue ou falsetrue
:emailEmail válido"user@example.com"
:passwordSenha 8+ caracteres"xK9#mP2$"
:phoneTelefone brasileiro"(11) 98765-4321"
:cpfCPF formatado"123.456.789-00"
:cnpjCNPJ formatado"12.345.678/0001-00"
:cep / :zip_codeCEP"01234-567"
:colorCor hexadecimal"#A1B2C3"
:editor / :htmlHTML com parágrafo"<p>Lorem ipsum...</p>"
:file / :imageURL de imagem[{url: "https://..."}]

🔗 Campos de Seleção e Relacionamentos

Com inclusion (valores fixos)

fieldset :form do
field :status, type: :select, inclusion: %w[active inactive pending]
end

customer = Customer.fake
customer.status # => "active" (ou outro valor aleatório da lista)

Com collection (relacionamento)

fieldset :form do
field :category_id, type: :select, collection: "/categories"
end

product = Product.fake
product.category # => #<Category ...> (criado automaticamente)

Se o modelo relacionado já existir, você pode passá-lo:

category = Category.fake(name: "Eletrônicos")
product = Product.fake(category: category)
product.category.name # => "Eletrônicos"

Relacionamentos Múltiplos

fieldset :form do
field :tag_ids, type: :select, collection: "/tags", multiple: true
end

product = Product.fake
product.tags # => [#<Tag ...>] (pelo menos um criado)

🏗️ Criando Hierarquias

Modelo com Pai Obrigatório

# Account é pai de Customer
account = Account.fake
customer = Customer.fake(account: account)

Ou deixe criar automaticamente:

customer = Customer.fake
# Account é criado automaticamente se Customer pertence a Account

Cadeia de Dependências

# Account -> Store -> Sale -> CartItem
account = Account.fake
store = Store.fake(account: account)
customer = Customer.fake(account: account)
sale = Sale.fake(account: account, store: store, customer: customer)
item = CartItem.fake(sale: sale)

✅ Tratamento de Validações

Se os dados gerados não passarem na validação, fake lança erro:

# Se Customer requer campo não mapeado pelo faker
Customer.fake
# => ArgumentError: Customer - Erros de validação: special_field can't be blank

Solução: passe o campo obrigatório:

Customer.fake(special_field: "valor_obrigatorio")

🧪 Uso em Testes

RSpec

describe Customer do
it "cria cliente válido" do
customer = Customer.fake
expect(customer).to be_persisted
expect(customer.name).to be_present
end

it "aceita valores customizados" do
customer = Customer.fake(name: "João Teste")
expect(customer.name).to eq("João Teste")
end

it "cria instância sem salvar" do
customer = Customer.new_fake
expect(customer).not_to be_persisted
expect(customer).to be_valid
end
end

Factory Pattern

Combine com FactoryBot se preferir:

FactoryBot.define do
factory :customer do
initialize_with { Customer.new_fake(attributes) }

trait :vip do
status { "vip" }
total_purchases { 50000.0 }
end
end
end

🔧 Campos Especiais

Confirmação de Senha

Para campos *_confirmation, o valor é copiado automaticamente:

fieldset :form do
field :password, type: :password
field :password_confirmation, type: :password
end

user = User.fake
user.password # => "abc123XYZ"
user.password_confirmation # => "abc123XYZ" (mesmo valor)

Campos Virtuais (attribute: true)

Campos com attribute: true também recebem dados:

fieldset :form do
field :temporary_code, type: :text, attribute: true
end

model = Model.fake
model.temporary_code # => "generated text"

💡 Boas Práticas

✅ Faça

  • Use fake para popular o banco em desenvolvimento
  • Use new_fake para testes que não precisam persistir
  • Passe valores específicos quando necessário
  • Crie registros pais antes dos filhos quando houver validações

❌ Evite

  • Usar fake em produção (módulo não está disponível)
  • Depender de valores específicos gerados (são aleatórios)
  • Criar muitos registros em loops sem necessidade

📋 Exemplo Completo

# Popular banco para desenvolvimento
account = Account.fake(name: "Petshop Demo")

store = Store.fake(
account: account,
name: "Loja Centro"
)

5.times do
customer = Customer.fake(account: account)

pet = Pet.fake(
account: account,
customer: customer
)

3.times do
Sale.fake(
account: account,
store: store,
customer: customer
)
end
end

puts "Criados: #{Customer.count} clientes, #{Pet.count} pets, #{Sale.count} vendas"

Com o sistema de fake data, você acelera o desenvolvimento e testes com dados realistas. 🧠✨