ik geconfronteerd met de problemen rond mock.patch en geparametreerd en gecontroleerd hoe deze werken in het algemeen, dus ik zou schrijven hier. Dit bericht zal uitleggen hoe Spot.,patch versieren in het algemeen en geparametreerd zal later worden uitgelegd in andere post.
laat me eerst het basisding voor mock afdekken.patch door het schrijven van eenvoudige python test.
in principe kunnen we het object vervangen dat is opgegeven als een eerste argument voor “mock.patch ” met magicmock instantie of een object dat u hebt opgegeven als een tweede argument. Dit is zeer nuttig wanneer u eenheidstest schrijft om ander modulegedrag te controleren waarvan de geteste module afhangt.
Als u bovenstaande voorbeeldcode hebt uitgevoerd, ziet de uitvoer er als volgt uit:
“mock.patch ” lijkt werkt correct zoals je kunt zien.,
eigenlijk zijn er vele andere manieren om patch te gebruiken. Bijvoorbeeld met ” met Verklaring “en met” start methode, einde methode ” … maar dit bericht richten op het uitleggen decorateur gebruik. Laten we in spot duiken.patch decorator
de functie om mock te genereren.patch decorator
Geciteerd belangrijk punt van de werkelijke broncode en bellow code is de werkelijke decorator gebruikt wanneer we schrijven ” @mock.,patch (target) “
in principe zal deze functie de decorator functie genereren met” getter “wat de functie is om daadwerkelijk object te retourneren met attribuut dat u wilde vervangen en” attribuut ” wat de naam is van het object dat u wilt vervangen. en genereer vervolgens” _patch class ” object dat decorateur zal zijn met deze.
aangezien het waarschijnlijk niet eenvoudig is om alleen met tekst uit te leggen, zal ik python-code schrijven en hetzelfde doen als het eerste voorbeeld. balg code is uittreksels uit bovenstaande voorbeeldcode.,
import os
import [email protected]("os.listdir", mock.MagicMock(return_value="test1"))
def test1():
assert "test1" == os.listdir()
Dit kan worden geschreven als volgende
als we meer demonteren, zal de code
zijn nu is het duidelijker wat mock.patch wel, hè?
maar toch hebben we big black box genaamd als ” mock.bespotten._patch “en dit was het meest interessante punt, dus vooruit te gaan om te kijken naar binnen” mock.bespotten._patch”.
Inside decorator (mock.bespotten._patch)
Dit lijkt de functie door uit de naam aan te nemen dat de naam van dit opvraagbare object niet begint met een hoofdletter, maar eigenlijk is dit de klasse om patch core logica te implementeren., Hoewel ik zei dat er veel manieren zijn om te gebruiken / roepen “mock.patch”, hun verschillen zijn gewoon hoe te bellen (frontend deel) en alle methoden uiteindelijk te gebruiken ” mock.bespotten._patch ” klasse om patch logica te bereiken, dus het lezen van dit is zinvol als je interessant bent om interne patch.
laat de code zien, maar één ding moet ik je eraan herinneren. Ik bewerkte de code veel en nog meer de code worden getoond vanaf hier kan niet worden uitgevoerd, dus denk dat het als python als pseudo-code. Ik wilde het zo eenvoudig mogelijk te maken en het gemakkelijk te begrijpen door deze pseudo-code., Als je de werkelijke code wilt lezen, ga dan naar github.
Ik heb veel opmerkingen toegevoegd, dus Ik wil dat je deze leest voordat je verder gaat. Als aanvulling wil ik een lijst van de punten die ik wil dat u opvalt., ondersteuning klasse en functie
Dit is het overzicht van hoe mock.patch toegepast en als je begrijpt tot hier, waarschijnlijk is het niet moeilijk om meer details te weten, zoals hoe te vervangen en terug te draaien … en wat dan ook … lees gewoon de code als je wilt.,
als laatste zou ik het python script schrijven dat uitlegt wat ik heb uitgelegd
Dit is gemaakt op basis van het vorige voorbeeld. Dit script is voor het controleren of de functie is veranderd of niet door “id” ingebouwde functie en check “patchings” lijst van functie als een laatste stap. Dus laten we eens kijken naar het resultaat
zoals je kunt zien, was de id van test1 4506785744 voordat een patch werd toegepast en vervolgens gewijzigd in 4514980040 nadat patch de eerste keer werd toegepast, maar de tweede patch veranderde de id van de functie niet, wat bewees dat de functie niet is veranderd vanaf het moment dat de patch voor de eerste keer werd toegepast., De laatste stap bewezen test1 functie hebben alle patch object ik toegepast in 3 stappen.
samenvatting
Ik heb mock en patch gebruikt voor een periode waarin ik unit test schrijf, maar ik heb de code niet eerder gelezen, dus het lezen was erg interessant en ik vond wat informatie die ik niet eerder wist. meer specifiek hoe patch versieren / veranderen mijn oorspronkelijke functie is goed inzicht wanneer Ik code te schrijven.
Volgende post zal opnieuw de verklaring zijn voor een van de test gerelateerde python bibliotheken”geparametreerd”