Stubbing seguro com falso

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 .