Ik schrijf veel unit tests. Helaas vereist mijn code vaak dat monkey patching correct wordt getest. Ik gebruik vaak de functie patch
uit Michael Foord ‘ s mock library (nu beschikbaar in Python 3.4 als unittest.mock) om aap patch mijn code.
tijdens het chatten met andere gebruikers van patch
, realiseerde ik me dat iedereen zijn eigen favoriete manier lijkt te hebben om het te gebruiken. In dit bericht zal ik de manieren waarop ik patch gebruiken bespreken.,
Decorator
patch kan worden gebruikt als methode decorator:
of als klasse decorator:
Ik gebruik patch Als decorator wanneer ik een functie heb die ik tijdens mijn hele test wil patchen. Ik heb de neiging om patch niet te gebruiken als een klasse decorateur en Ik zal uitleggen waarom hieronder.
Decorator voorbeeld
Context Manager
patch kan worden gebruikt als context manager:
Ik gebruik liever patch als context manager wanneer ik een functie slechts voor een deel van een test wil patchen. Ik gebruik patch niet als context manager wanneer ik een functie wil patchen voor een hele test.,
Contextmanager voorbeeld
handmatig met start en stop
patch kan ook worden gebruikt om handmatig te patchen / uitpakken met start
en stop
methoden:
Ik gebruik liever patch met start/stop als ik een functie nodig heb die moet worden gepatcht voor elke functie in een testklasse.
Dit is waarschijnlijk de meest voorkomende manier waarop ik patch gebruik in mijn tests. Ik groepeer mijn tests vaak in testklassen waar elke methode is gericht op het testen van dezelfde functie. Daarom zal ik meestal dezelfde functies/objecten gepatcht voor elke testmethode.,
Ik merkte hierboven op dat ik liever geen class decorators gebruik om dit probleem op te lossen. In plaats daarvan gebruik ik liever Test class attributen om verwijzingen naar gepatchte functies op te slaan in plaats van patchargumenten te accepteren op elke testmethode met decorateurs. Ik vind dit DROOGTER.
Waarschuwing: Een van de belangrijkste voordelen van de vormen van Patch voor decorator/context manager is dat ze opruimen voor u afhandelen. Wanneer u start
aanroept om uw patch-object in te stellen, vergeet dan altijd stop
aan te roepen om het op te schonen., Anders heb je een monkey patched functie/object voor de rest van je lopende programma.
start en stop voorbeeld
samenvatting
Patch kan worden gebruikt:
- als methode of klasse decorator
- als context manager
- met behulp van start en stop methoden
Ik geef de voorkeur aan leesbaar, droog en gemakkelijk te wijzigen. Ik heb de neiging om start/stop methoden te gebruiken om die reden, maar ik gebruik ook vaak patch methode decorateurs en soms gebruik maken van patch context managers., Het is handig om de verschillende smaken van patch
te kennen, omdat uw favoriete smaak niet altijd de meest geschikte is voor het probleem.