comment se moquer.patch décorateur travaille en python

Yuki Nishiwaki

Suivre

le 23 Février, 2018 · 5 min en lecture

j’ai affronté le mal autour de fantaisie.patch et paramétré et vérifié comment cela fonctionne en général, donc j’écrirais ici. Ce post expliquera comment se moquer.,patch décorer en général et paramétré sera expliqué dans un autre post plus tard.

tout d’abord, permettez-moi de résumer la chose de base pour mock.patch en écrivant un test python simple.

Fondamentalement, nous pouvons remplacer l’objet qui est spécifié comme premier argument pour « mock.patch  » avec l’instance MagicMock ou tout objet que vous avez spécifié comme deuxième argument. Ceci est très utile lorsque vous écrivez un test unitaire pour contrôler le comportement d’un autre module dont dépend le module testé.

Si vous avez exécuté un exemple de code ci-dessus, la sortie semble être la suivante

« mock.patch” semble fonctionne correctement comme vous pouvez le voir.,

en fait, il existe de nombreuses autres façons d’utiliser le patch. Par exemple avec « with statement « et avec” méthode de début, méthode de fin » But mais cet article se concentre sur l’explication de l’utilisation du décorateur. Plongeons-nous en moquer.patch décorateur

La fonction pour générer de la maquette.patch decorator

point important Cité du code source réel et du code ci-dessous est le décorateur réel utilisé lorsque nous écrivons « @mock.,patch (target)”

fondamentalement, cette fonction générera la fonction décorateur avec « getter” qui est la fonction pour renvoyer l’objet réel ayant l’attribut que vous vouliez remplacer et « attribute” qui est le nom de l’objet que vous souhaitez remplacer. et puis générez l’objet « _patch class » qui sera décorateur avec ceux-ci.

puisque probablement expliquer par seulement du texte n’est pas chose facile, alors laissez-moi écrire du code python faire la même chose que le premier exemple. le code ci-dessous est extrait de l’exemple de code ci-dessus.,

import os
import [email protected]("os.listdir", mock.MagicMock(return_value="test1"))
def test1():
assert "test1" == os.listdir()

cela peut être écrit comme suit

Si nous démontons plus, le code sera

maintenant, il est devenu plus clair ce que mock.patch fait, n’est-ce pas?
mais nous avons encore une grande boîte noire appelée  » mock.moquer._patch  » et c’était le point le plus intéressant, alors déplacez-vous pourpassé regarder à l’intérieur « mock.moquer._patch”.

décorateur intérieur (mock.moquer._patch)

cela semble la fonction en supposant à partir du nom que le nom de cet objet appelable ne commence pas à partir du caractère majuscule, mais en fait c’est la classe pour implémenter la logique de base de patch., Bien que j’ai dit qu’il y a beaucoup de façons d’utiliser/appeler « mock.patch », leurs différences sont juste comment appeler (partie frontend) et toutes les méthodes utilisent éventuellement « mock.moquer._patch  » classe pour atteindre la logique de patch, donc lire ceci est significatif si vous êtes intéressant de patcher interne.

voyons le code, mais une chose que je dois vous rappeler. J’ai beaucoup modifié le code et encore plus le code affiché à partir d’ici ne peut pas être exécuté, alors pensez-le comme un pseudo-code python. Je voulais le rendre simple autant que possible et le rendre facile à comprendre par ce pseudo code., Si vous voulez lire le code réel, allez sur github.

j’ai ajouté beaucoup de commentaires, donc je veux que vous lisiez ces avant d’aller de l’avant. En complément, laissez-moi énumérer les points que je veux que vous remarquiez., support class and function

  • si le Décorateur est utilisé pour la classe, la méthode ayant le nom commençant par « test_” de cette classe sera décorée par le décorateur copié (en interne, utilisez simplement function decorator)
  • le comportement du décorateur de fonction (Def decorate_callable) changera en fonction du nombre de patch que vous utilisez pour une méthode
  • La première décoration de patch retournera une nouvelle méthode interne(Def patché) qui a une liste de « patchings” incluant self, mais à partir de la deuxième décoration de patch, cette décoration de patch ajoutera simplement self à « patchings” liste de fonction décorée et retour fonction originale.,
  • fonction patchée qui est renvoyée lors de la première évaluation de la décoration de patch, Vérifiez essentiellement la liste « patchings” et essayez de remplacer tous les objets de cette liste, cette logique d’itération pour la liste « patchings” permet à l’utilisateur de spécifier plusieurs décorateurs de patch.
  • ceci est l’aperçu de la façon dont mock.patch appliqué et si vous comprenez jusqu’à Ici, il n’est probablement pas difficile de connaître plus de détails comme comment remplacer et annuler…et peu importe read lisez simplement le code si vous voulez.,

    enfin, j’écrirais le script python qui expliquerait ce que j’ai expliqué

    ceci est créé sur la base de l’exemple précédent. Ce script sert à vérifier que la fonction est modifiée ou non par la fonction intégrée « id” et à vérifier la liste « patchings” de la fonction en dernière étape. Voyons donc le résultat

    comme vous pouvez le voir, l’id de test1 était 4506785744 avant d’appliquer un patch, puis changé en 4514980040 après le patch appliqué la première fois mais le deuxième patch n’a pas changé l’id de la fonction, ce qui a prouvé que la fonction n’a pas été modifiée depuis le moment, La dernière étape a prouvé que la fonction test1 a tous les objets de patch que j’ai appliqués en 3 étapes.

    résumé

    j’ai utilisé mock et patch pour un âge où écrire un test unitaire mais je n’ai pas lu le code auparavant, donc le lire était très intéressant et j’ai découvert des informations que je ne connaissais pas auparavant. plus précisément, comment Patcher décorer / changer ma fonction d’origine est une bonne idée lorsque j’écris du code.

    le prochain article sera à nouveau l’explication de l’une des bibliothèques python liées aux tests « paramétrées”

    Leave a Comment