Olá pessoal. Tudo certo?!
Microsoft está lançando, junto ao VS 2012, um novo framework de isolamento. Trata-se do Microsoft Fakes.
Para dar uma ideia de como esse framework funciona, apresento essa mini-série com apenas dois posts. Neste, falo sobre o recurso que considero mais relevante: Shims.
Reproduzindo a definição do msdn:
Microsoft Fakes is an isolation framework for creating delegate-based test stubs and shims in .NET Framework applications. The Fakes framework can be used to shim any .NET method, including non-virtual and static methods in sealed types.
Entendeu? Não? Vamos para um exemplo prático.
Considere a seguinte classe:
Alguns testes que gostaria de realizar:
O código indicado tem um problema sério. A chamada para a propriedade estática Datetime.Now. Afinal, como testar essa característica?!
Uma saída seria uma refatoração do código. Considere:
Eis uma redução evidente do acoplamento. Invertemos a dependência e tudo parece estar resolvido. Entretanto, você realmente gostou dessa solução?! Para mim, parece ser excesso de cuidado que pode se reverter em código desnecessário rapidamente.
Uma alternativa para fazer esse tipo de teste é através da utilização de Shims – novo recurso do Microsoft Fakes.
Pegando a definição do MSDN:
Shim types are one of two technologies that the Microsoft Fakes Framework uses to let you easily isolate unit tests from the environment. Shim types allow detouring of hard-coded dependencies on static or non-overridable methods.
Shims são tipos gerados pelo Visual Studio 2012 quando você solicita a geração de Fakes para um Assembly (na lista de referências para o projeto). Veja:
Com eles, podemos escrever um teste para o código proposto da seguinte forma:
Vamos entender o que foi feito:
Por baixo dos panos, a infraestrutura do IntelliTrace substitui as chamadas ao método original pela especificada no Shim.
Considere agora o seguinte código:
A ideia aqui é simplesmente demonstrar um código que tem dependência de IO – o que é muito ruim para testar. Veja como escrevi os testes para esse método:
Veja como os Shims removeram, elegantemente, a necessidade de IO dos nossos testes.
Bacana, não?!
Shims possibilitam que testemos nosso SUT ignorando acoplamentos mais fortes – sejam eles estáticos, ou não.
Considero uma opção muito interessante para cenários onde estejamos trabalhando com código legado onde o redesign implique em esforço inadequado. Entretanto, temos que considerar que a necessidade de Shims geralmente estará associada a um design mais pobre. Além disso, eles adicionam alguma penalidade de performance para os testes.
Se você gostou de Shims, considere dar uma olhada na documentação oficial: http://msdn.microsoft.com/en-us/library/hh549176. Lá, você encontra como utilizar o framework para cenários com métodos não estáticos, por exemplo.
Também é importante destacar que Shims funcionam apenas no VS ou no Team Build.
Para esse post, era isso.
Muito bom esse post, vou esperar pelo próximo!
Elemar, você usa qual framework para gerar fakes, mocks?
Consegue comparar com o que a MS ofereceu no VS2012?
Por coincidência estava lendo sobre isso hoje em um artigo que não avaliou muito bem o FW de Fakes da MS, se puder dê uma olhada:
VS11 Fakes Framework Considered Harmful
http://blog.pluralsight.com/2012/04/23/vs11-fakes-framework/
Abraços!
Não concordo com o autor. Microsoft Fakes são ferramentas – boas, por sinal. Não podem ser responsabilizadas por mau uso.
Você substituiria alguma que acredito que deva usar atualmente por Microsoft Fakes? Em qual ponto discorda do autor?
Estou buscando aprender as diferenças também por isso lhe questiono.
Sem problemas!
Eu adotaria Shims para sistemas legados onde fosse muito complicado usar Moq (mocks/stubs). Em outros casos, preferiria refinar meu design.
Acho que o autor dá responsabilidades demais para a ferramenta. Ele assume que os desenvolvedores vão fazer uso ruim das ferramentas e, por isso, elas seriam inadequadas.
O que você acha?!
Muito bom. Isso realmente vai simplificar alguns casos de testes mais difíceis de implementar sem criar um excesso de interfaces e inversões de controle e sem usar o TypeMock. Agora, infelizmente a internet me estragou, pra mim shim é outra coisa.
O que é Shim para você?!
Pingback: Conhecendo Microsoft Fakes – Parte 2 de 2 – Stubs « Elemar DEV
“Além disso, eles adicionam alguma penalidade de performance para os testes”
“Performance. Shims run slower because they rewrite your code at run time. Stubs do not have this performance overhead and are as fast as virtual methods can go.”
Realmente, teste de 200ms foi pra 15 a 35 segundos
para uma app pequenina 10s+ não é muito tempo pra num teste rodar não?