« HE:labs
HE:labs

Gerando dados "reais" com o Faker

Postado por Thiago Belem em 06/11/2013

Com o Faker, você pode gerar dados aleatórios muito mais próximos do que o seu usuário final irá criar. Com isso, as suas factories ficariam mais realistas.

Gerando dados reais com o Faker

Faker é uma gem que te ajuda a gerar dados fictícios. Com ela você pode criar:

  • Endereços (cidades, estados, endereços, CEPs, países);
  • Dados de empresas (nomes, slogans e etc.);
  • Dados de Internet (emais, usuários, domínios, IPv4, IPv6 e URLs);
  • Lorem Ipsums (palavras, frases, parágrafos);
  • Nomes (nomes, sobrenomes, sufixos e prefixo);
  • Telefones

Com esses recursos, fica muito mais fácil criar factories (do FactoryGirl) que tem dados mais parecidos com o que o usuário final vai produzir.

Para ilustrar seu funcionamento, vamos imaginar que você tem os seguintes models:

1 class Post < ActiveRecord::Base
2   belongs_to :author
3 
4   validates :title, :content, presence: true
5   validates :title, uniqueness: true
6 end
1 class Author < ActiveRecord::Base
2   has_many :posts
3 
4   validates :name, :email, :city, presence: true
5   validates :name, :email, uniqueness: true
6 end

E teríamos, inicialmente, as seguintes factories:

1 FactoryGirl.define do
2   factory :post do
3     title 'Título do post'
4     content 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
5     author
6   end
7 end
1 FactoryGirl.define do
2   factory :author do
3     name 'Fulano da Silva'
4     email 'fulano@silva.com.br'
5     city 'Rio de Janeiro'
6   end
7 end

Não há nada de errado com essas factories. O problema surge quando precisamos criar, por exemplo, uma lista de posts com FactoryGirl.create_list(:post, 3) e iremos receber diversos erros das validações de uniqueness dos dois models.

Para isso, poderíamos usar sequences do FactoryGirl para tentar contornar isso, mas não acho que "Fulano da Silva 1" ou "Fulano da Silva 2" sejam o caminho.

Factories dinâmicas com Faker

Podemos modificar nossas factories para usar dados gerados pelo Faker:

1 FactoryGirl.define do
2   factory :post do
3     title { Faker::Lorem.sentence(8) }
4     content { Faker::Lorem.paragraph(4) }
5     author
6   end
7 end
1 FactoryGirl.define do
2   factory :author do
3     name { Faker::Name.name }
4     email { Faker::Internet.email }
5     city { Faker::Address.city }
6   end
7 end

E assim teremos posts com títulos e conteúdos diferentes (ok, Lorem Ipsum não é a melhor coisa do mundo), mas também teremos autores com nomes como "Davion Fay" e emails como "haylee_hayes@reynoldssanford.info".

O problema do uniqueness foi resolvido. Exceto em alguns casos bem raros onde, se você criar muitos registros, pode acabar gerando dois com o mesmo nome ou email, mas aí pode ser uma questão para você repensar o seu caso de teste.

Gerando dados em Português

Os dados gerados pelo Faker são, por padrão, nomes, endereços e cidades em inglês. O que pode deixar o seu sistema não tão real assim... Para resolver esse problema é só definir qual idioma o Faker irá usar no seu spec_helper.rb:

1 Faker::Config.locale = :"pt-br"

Com isso, os dados gerados serão como "Alessandro Silva", "Rio de Janeiro" e etc.

Até a próxima!

Compartilhe

Sabia que nosso blog agora está no Medium? Confira Aqui!