Momenteel zit ik op een project waar we veelvuldig gebruik maken van het Fakes Framework van Microsoft. Een van de features van dit framework is het maken van shims. Dit stelt je in staat om een soort van stubs/mocks te maken voor classes die public/sealed/non-overridable zijn. Een veel gebruikt voorbeeld is DateTime.Now. Enorm handig voor het testen van framework klassen waar je geen controle over hebt.
Nu gebruiken we het fakes framework op dit project ook veel voor het shimmen van onze eigen klassen. Deze klassen hebben dus wel public/internal methodes, maar geen interface, virtual en/of abstracte methodes. Veelal zijn dit factories, builders, filters, maar ook vele andere type klassen.
Zelf vind ik het gebruik van shims veel weg hebben van TDD cheating. Je code is immers niet testbaar opgezet en daardoor moet je ineens gebruik maken van dit soort technieken.
Het voordeel is natuurlijk dat je niet 'onnodige' interfaces hoeft te definieren die alleen maar bestaan om je code testbaar te maken. Of nog erger, allemaal abstracte en virtual methodes/klassen te maken, alleen maar om dit te kunnen mocken/stubben. Je vervuilt je codebase dus niet om het beter testbaar te maken.
Aangezien ik natuurlijk niet de enige ben die in grote en complexe projecten meedraai vroeg ik me af hoe dit in jullie projecten wordt aangepakt. Ook vraag ik me af of ik de enige ben die shims een enigzins smerig vind, of dat die mening ook hier wordt gedeeld.
Nu gebruiken we het fakes framework op dit project ook veel voor het shimmen van onze eigen klassen. Deze klassen hebben dus wel public/internal methodes, maar geen interface, virtual en/of abstracte methodes. Veelal zijn dit factories, builders, filters, maar ook vele andere type klassen.
Zelf vind ik het gebruik van shims veel weg hebben van TDD cheating. Je code is immers niet testbaar opgezet en daardoor moet je ineens gebruik maken van dit soort technieken.
Het voordeel is natuurlijk dat je niet 'onnodige' interfaces hoeft te definieren die alleen maar bestaan om je code testbaar te maken. Of nog erger, allemaal abstracte en virtual methodes/klassen te maken, alleen maar om dit te kunnen mocken/stubben. Je vervuilt je codebase dus niet om het beter testbaar te maken.
Aangezien ik natuurlijk niet de enige ben die in grote en complexe projecten meedraai vroeg ik me af hoe dit in jullie projecten wordt aangepakt. Ook vraag ik me af of ik de enige ben die shims een enigzins smerig vind, of dat die mening ook hier wordt gedeeld.
Battle.net - Jandev#2601 / XBOX: VriesDeJ