Pergunta

Muitas pessoas usam objetos simulados quando estão escrevendo testes de unidade.O que é uma Objeto simulado?Por que eu precisaria de um?Eu preciso de uma estrutura de objetos simulados?

Foi útil?

Solução

Object Mocking é usado para manter as dependências fora do seu teste de unidade.Às vezes você terá um teste como "SelectPerson" que selecionará uma pessoa do banco de dados e retornará um objeto Person.

Para fazer isso, você normalmente precisaria de uma dependência do banco de dados, no entanto, com a simulação de objetos, você pode simular a interação com o banco de dados com uma estrutura simulada, para que ele possa retornar um conjunto de dados semelhante ao retornado do banco de dados e você pode então testar seu código para garantir que ele lide com a tradução de um conjunto de dados para um objeto pessoal, em vez de usá-lo para testar se existe uma conexão com o banco de dados.

Outras dicas

Várias pessoas já responderam ao 'o quê', mas aqui estão alguns 'porquês' rápidos que consigo pensar:

  1. Desempenho

    Como os testes de unidade devem ser rápidos, testar um componente que interage com uma rede, um banco de dados ou outro recurso intensivo em tempo não precisa pagar a penalidade se for feito usando objetos simulados.As economias aumentam rapidamente.

  2. Colaboração

    Se você está escrevendo um código de código bem encapsulado que precisa interagir com o código de outra pessoa (que ainda não foi escrito ou está sendo desenvolvido em paralelo - um cenário comum), você pode exercer seu código com objetos simulados uma vez que um A interface foi acordada.Caso contrário, seu código pode não começar a ser testado até que o outro componente seja concluído.

Um objeto simulado permite testar apenas o que você está escrevendo e detalhes abstratos, como acesso a um recurso (disco, serviço de rede, etc.).A simulação permite que você finja ser aquele recurso externo, ou classe, ou qualquer outra coisa.

Você realmente não precisa de uma estrutura de objeto simulada, apenas estenda a classe da funcionalidade com a qual você não quer se preocupar em seu teste e certifique-se de que a classe que você está testando possa usar sua simulação em vez da coisa real (passe-a através de um construtor ou setter ou algo assim.

A prática mostrará quando as simulações são úteis e quando não são.

EDITAR:Zombar de recursos é especialmente importante para que você não precise confiar que eles existam durante o teste e você possa zombar dos detalhes de como eles existem e o que respondem (como simular uma FileNotFoundException ou um serviço da web que está faltando ou vários valores de retorno possíveis de um webservice)...tudo sem os tempos de acesso lentos envolvidos (a simulação será MUITO mais rápida do que acessar esses recursos no teste).

Eu preciso de uma estrutura de objetos simulados?

Certamente não.Às vezes, escrever simulações à mão pode ser bastante entediante.Mas para coisas simples, não é nada ruim.Aplicando o princípio de Último momento responsável para estruturas de simulação, você só deve mudar de simulações escritas à mão para uma estrutura quando provar a si mesmo que simulações escritas à mão são mais problemáticas do que valem a pena.

Se você está apenas começando com a simulação, pular direto para uma estrutura vai pelo menos dobrar sua curva de aprendizado (você consegue dobrar uma curva?).Zombar de estruturas fará muito faz mais sentido quando você passa alguns projetos escrevendo simulações à mão.

Object Mocking é uma maneira de criar um objeto "virtual" ou simulado a partir de uma interface, classe abstrata ou classe com métodos virtuais.Ele permite que você envolva um deles em sua própria definição para fins de teste.É útil para criar um objeto confiável para um determinado bloco de código que você está testando.

Um popular que gosto de usar se chama Quantidade mínima, mas existem muitos outros como o RhinoMock e vários outros que eu não conheço.

Ele permite que você teste como uma parte do seu projeto interage com o resto, sem construir tudo e potencialmente perder uma parte vital.

EDITAR:Ótimo exemplo da Wikipedia:Ele permite que você teste o código com antecedência, como um projetista de carro usa um boneco de teste de colisão para testar o comportamento de um carro durante um acidente.

Outro uso é permitir que você teste outras partes do seu sistema que ainda não foram construídas.Por exemplo, se sua classe depende de alguma outra classe que faz parte de um recurso no qual outra pessoa está trabalhando, você pode simplesmente solicitar uma interface quase completa, programar para a interface e apenas simular os detalhes conforme espera que funcionem.Em seguida, certifique-se de que suas suposições sobre a interface estejam corretas (enquanto você estiver desenvolvendo ou quando o recurso estiver concluído).

Se uma estrutura de simulação é útil ou não, depende em parte da linguagem do código que você está escrevendo.Com uma linguagem estática, você precisa fazer um esforço extra para enganar o compilador e fazê-lo aceitar seus objetos simulados como substitutos dos reais.Em uma linguagem de tipo dinâmico, como Python, Ruby ou Javascript, geralmente você pode simplesmente anexar os métodos a um objeto ou classe arbitrária e passá-los como parâmetro - portanto, uma estrutura agregaria muito menos valor.

Duas estruturas de simulação recomendadas para testes de unidade .net são Typemock Isolator e Rhino Mock.

No link a seguir você pode ver uma explicação do Typemock sobre por que você precisa de um estrutura de zombaria para teste de unidade.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top