Gerar CPF em Ruby: Função com Testes RSpec
Em projetos Rails e scripts Ruby, gerar CPF programaticamente é indispensável para popular factories, seeds e specs com dados realistas. As funções abaixo implementam o algoritmo de módulo 11 e produzem CPFs sintaticamente válidos, perfeitos para testes automatizados.
Código
def gerar_cpf
digits = Array.new(9) { rand(0..9) }
# Primeiro dígito verificador
soma = 0
9.times { |i| soma += digits[i] * (10 - i) }
resto = soma % 11
digits << (resto < 2 ? 0 : 11 - resto)
# Segundo dígito verificador
soma = 0
10.times { |i| soma += digits[i] * (11 - i) }
resto = soma % 11
digits << (resto < 2 ? 0 : 11 - resto)
digits.join
end
def validar_cpf(cpf)
cpf = cpf.gsub(/[^\d]/, '')
return false unless cpf.length == 11
# Rejeita CPFs com todos os dígitos iguais
return false if cpf.chars.uniq.length == 1
digits = cpf.chars.map(&:to_i)
# Verifica primeiro dígito
soma = 0
9.times { |i| soma += digits[i] * (10 - i) }
resto = soma % 11
esperado = resto < 2 ? 0 : 11 - resto
return false unless digits[9] == esperado
# Verifica segundo dígito
soma = 0
10.times { |i| soma += digits[i] * (11 - i) }
resto = soma % 11
esperado = resto < 2 ? 0 : 11 - resto
return false unless digits[10] == esperado
true
endAnálise do código
A função gerar_cpf começa criando um array com nove dígitos aleatórios usando rand(0..9), que retorna um inteiro entre 0 e 9 inclusive. O método Array.new(9) { rand(0..9) } é idiomático em Ruby e cria o array já preenchido em uma única expressão.
O cálculo dos dígitos verificadores segue o algoritmo módulo 11. Para o primeiro dígito, cada um dos nove dígitos base é multiplicado por pesos decrescentes de 10 a 2, a soma é dividida por 11 e o resto determina o dígito: se menor que 2, o dígito é 0; caso contrário, subtrai-se de 11. O segundo dígito repete o processo com os dez dígitos já calculados e pesos de 11 a 2. Ambos os dígitos são adicionados ao array com o operador <<.
A função validar_cpf remove caracteres não numéricos com gsub, verifica o comprimento de 11 dígitos, rejeita sequências com todos os dígitos iguais usando chars.uniq.length == 1 e recalcula os dois dígitos verificadores para comparar com os informados. Ao final, digits.join concatena todos os 11 dígitos em uma string, produzindo o CPF completo.
Uso
cpf = gerar_cpf
puts "CPF gerado: #{cpf}"
puts "Válido: #{validar_cpf(cpf)}"Testes
require 'rspec'
RSpec.describe 'gerar_cpf' do
it 'retorna uma string com 11 dígitos' do
cpf = gerar_cpf
expect(cpf).to match(/\A\d{11}\z/)
expect(cpf.length).to eq(11)
end
it 'gera CPFs que passam na validação' do
100.times do
cpf = gerar_cpf
expect(validar_cpf(cpf)).to be(true), "CPF inválido gerado: #{cpf}"
end
end
it 'gera CPFs diferentes em chamadas consecutivas' do
cpfs = Array.new(3) { gerar_cpf }
expect(cpfs.uniq.length).to be > 1
end
endExecute os testes com rspec no diretório do projeto. O segundo teste gera 100 CPFs e valida cada um, garantindo que o algoritmo de geração está correto de forma consistente.
Para validar CPFs existentes em Ruby, consulte o guia completo de validação em Ruby. Para gerar CPFs rapidamente sem código, use o gerador online.