Em testes isolados em Ruby, interfaces simuladas podem desalinhar com interfaces reais enquanto a base de código cresce. Isso pode ser evitado usando simulações que verificam as definições de método e falsificações que mantêm essas interfaces sincronizadas.
Digamos que comecemos com uma classe de repositório com o seguinte método de armazenamento:
def store(name)
end
E um controlador que o usa:
def create(params)
repository.store(params[:name])
end
Podemos testar a interação entre eles usando rr:
it 'stores resources' do
repository = stub
mock(repository).store('Penguin') { nil }
controller = Controller.new(repository)
controller.create(name: 'Penguin')
end
Depois de um tempo, precisamos armazenar a descrição também:
def store(name, description)
end
No entanto, o teste do controlador ainda passa enquanto está incorreto, porque ele não sabe nada sobre a interface do repositório. Ele pode ser facilmente corrigido com o Bogus usando falsificações .
it 'saves images' do
repository = fake(:repository)
mock(repository).store('Penguin') { nil }
controller = Controller.new(repository)
controller.create(name: 'Penguin')
end
Agora, este teste falha com ArgumentError: tentou stub store (name, description) com 1 argumento que nos aponta diretamente para a origem do problema.
Nos bastidores, o Bogus cria falsificações ao copiar a interface pública do repositório, adiciona uma sintaxe de simulação que imita o rr e verifica a existência e aridade dos métodos.
Você pode encontrar o falso no github e mais detalhes na documentação . Exemplos desta postagem estão aqui .