hoe mock.patch decorateur werkt in python

Yuki Nishiwaki

Volgen

Feb 23, 2018 · 5 min lezen

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

  • Als decorateur gebruikt voor de klas, de methode is met name aan het begin “test_” van die klasse zal worden ingericht door gekopieerd decorateur (intern gewoon gebruik maken van de functie decorateur)
  • De functie decorateur (def decorate_callable)’s gedrag zou veranderen, afhankelijk van hoeveel patch die u gebruikt een methode
  • Eerste patch decoratie terug nieuwe interne methode(def patches) die “patchings van de” lijst met inbegrip van de zelfstandigen, maar vanaf het tweede patch decoratie, deze patch decoratie voeg zelf tot “patchings van de” lijst van versierde functie en rendement oorspronkelijke functie.,
  • patched functie die wordt geretourneerd wanneer patchdecoratie voor de eerste keer wordt geëvalueerd, vink in principe de “patchings” – lijst aan en probeer alle objecten in die lijst te vervangen.deze iteratielogica voor “patchings” – lijst stelt de gebruiker in staat om meerdere patchdecorator op te geven.
  • 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”

    Leave a Comment