jag skriver en hel del enhetstester. Tyvärr kräver min kod ofta apa lapp för att vara korrekt enhetstestad. Jag använder ofta funktionen patch
från Michael Foords mock library (nu tillgänglig i Python 3.4 som unittest.mock) till monkey patch min kod.
När du chattar med andra användare av patch
insåg jag att alla verkar ha sitt eget favorit sätt att använda det. I det här inlägget kommer jag att diskutera hur jag använder patch.,
dekoratör
patch kan användas som en metod dekoratör:
eller som en klass dekoratör:
Jag använder patch som dekoratör när jag har en funktion Jag vill lappa under hela mitt test. Jag brukar inte använda patch som en klass dekoratör och jag ska förklara varför nedan.
Dekoratörsexempel
Kontexthanterare
patch kan användas som kontexthanterare:
Jag föredrar att använda patch som kontexthanterare när jag vill lappa en funktion för endast en del av ett test. Jag använder inte patch som kontexthanterare när jag vill ha en funktion patchad för ett helt test.,
exempel på Kontexthanterare
manuellt med start och stopp
patch kan också användas för att manuellt lappa/packa upp medstart
ochstop
metoder:
Jag föredrar att använda patch med start / stop när jag behöver en funktion som ska lappas för varje funktion i en testklass.
detta är förmodligen det vanligaste sättet jag använder patch i mina tester. Jag grupperar ofta mina tester i testklasser där varje metod är fokuserad kring att testa samma funktion. Därför vill jag vanligtvis ha samma funktioner / Objekt patched för varje testmetod.,
Jag noterade ovan att jag föredrar att inte använda klassdekoratorer för att lösa detta problem. Istället föredrar jag att använda testklassattribut för att lagra referenser till patchade funktioner istället för att acceptera patchargument på varje testmetod med dekoratörer. Jag tycker att det här är mer torrt.
Varning: En av de främsta fördelarna med decorator / context manager former av patch är att de hanterar städa upp för dig. När du anropar start
för att ställa in ditt patchobjekt, kom alltid ihåg att ringa stop
för att städa upp det., Annars har du en apa lappad funktion / objekt för resten av ditt program som körs.
starta och stoppa exempel
sammanfattning
Patch kan användas:
- som en metod eller klass dekoratör
- som en kontexthanterare
- använda start-och stoppmetoder
Jag föredrar att mina tester är läsbara, torra och lätta att ändra. Jag brukar använda start / stop-metoder av den anledningen, men jag använder också ofta patch method decorators och använder ibland patch context managers., Det är användbart att känna till de olika smakerna av patch
eftersom din favoritsmak kanske inte alltid är den mest lämpliga för problemet till hands.