qué burla.parche decorador funciona en python

Yuki Nishiwaki

Seguir

Feb 23, 2018 · 5 min de lectura

me enfrento a los problemas en torno a burlarse.parche y parametrizado y comprobado cómo estos funciona en general, así que me gustaría escribir aquí. Este post explicará cómo burlarse.,parche decorar en general y parametrizado se explicará en otro post más adelante.

En primer lugar permítanme cap lo básico para mock.parche escribiendo prueba simple de python.

Básicamente podemos reemplazar el objeto que se especifica como primer argumento para » mock.patch » con la instancia MagicMock o cualquier objeto especificado como segundo argumento. Esto es muy útil cuando se escribe unit test para controlar el comportamiento de otro módulo del que depende el módulo probado.

si ejecutó el código de ejemplo anterior, la salida se ve como

«mock.parche » parece que funciona correctamente como se puede ver.,

en realidad hay muchas otras formas de usar el parche. Por ejemplo, con » with statement «y con» start method, end method » But pero este post se centra en explicar el uso del decorador. Vamos a sumergirnos en mock.patch decorator

la función para generar mock.patch decorator

El punto importante Citado del código fuente real y el código de abajo es el decorador real utilizado cuando escribimos » @mock.,patch (target) «

Básicamente esta función generará la función decorator con» getter «que es la función para devolver el objeto real que tiene el atributo que desea reemplazar y» attribute » que es el nombre del objeto que desea reemplazar. y luego generar» _patch class » objeto que será decorador con estos.

ya que probablemente explicar solo por texto no es algo fácil, así que permítanme escribir código python hacer lo mismo que el primer ejemplo. el código de abajo es extractos del código de ejemplo anterior.,

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

Esto se puede escribió lo siguiente

Si desmontamos más, el código será

Ahora lo tengo más claro qué burlarse.patch lo hizo, ¿no? pero todavía tenemos una gran caja negra llamada «mock».burla._patch » y este fue el punto más interesante, así que muévete hacia adelante para mirar dentro «mock.burla._parche”.

decorador interior (mock.burla._patch)

esta parece la función asumiendo desde el nombre que el nombre de este objeto llamable no comienza desde el carácter capital, pero en realidad esta es la clase para implementar la lógica patch core., Aunque dije que hay muchas maneras de usar / llamar «mock».patch», sus diferencias son solo cómo llamar (parte frontend) y todos los métodos eventualmente usan «mock.burla._patch » para lograr la lógica de parches, por lo que leer esto es significativo si le interesa patch internal.

veamos el código, pero una cosa tengo que recordarte. Edité mucho el código y aún más el código que se muestra desde aquí no se puede ejecutar, así que piénsalo como un pseudo código de python. Quería hacerlo lo más simple posible y hacerlo fácil de entender por este pseudo código., Si quieres leer el código Real, ve a github.

he añadido muchos comentarios, así que quiero que los leas antes de seguir adelante. Como complemento, permítanme enumerar los puntos que quiero que noten., support class and function

  • si el decorador se usa para la clase, el método que tiene nombre comenzando «test_» de esa clase será decorado por el decorador copiado (internamente solo use function decorator)
  • El comportamiento del decorador de la función (def decorate_callable) cambiaría dependiendo de cuántos parches esté utilizando para un método
  • La primera decoración del parche devolverá un nuevo método interno(def patched) que tiene una lista de «parches» que incluye uno mismo, pero desde la segunda decoración del parche, esta decoración del parche uno mismo a la lista de «remiendos» de la función decorada y de la función original de la vuelta.,
  • Función parcheada que se devuelve cuando la decoración del parche se evalúa por primera vez, Básicamente, compruebe la lista «patchings» e intente reemplazar todos los objetos en esa lista, esta lógica de iteración para la lista «patchings» permite al usuario especificar varios decoradores de parches.
  • Este es el resumen de cómo mock.parche aplicado y si usted entiende hasta aquí, probablemente no es difícil saber más detalles como Cómo reemplazar y revertir whatever y lo que sea Just acaba de leer el código si quieres.,

    como última cosa, escribiría el script python que explica lo que expliqué

    esto se crea en base a la muestra anterior. Este script es para comprobar que la función es cambiada o no por la función incorporada» id «y comprobar la lista» patchings » de la función como último paso. Así que veamos el resultado

    Como puede ver, el id de test1 fue 4506785744 antes de aplicar cualquier parche y luego se cambió a 4514980040 después de aplicar el parche por primera vez, pero el segundo parche no cambió el id de la función, lo que demostró que la función no se ha cambiado desde el momento de aplicar el parche por primera vez., El último paso probó la función test1 tiene todo el objeto de parche que apliqué en 3 pasos.

    resumen

    he utilizado mock y patch para una edad en la que se escribe la prueba unitaria, pero no he leído el código antes, por lo que leerlo fue muy interesante y encontré algo de información que no sabía antes. más específicamente, cómo patch decorar / cambiar mi función original es una buena idea cuando escribo código.

    el siguiente post será de nuevo la explicación para una de las bibliotecas de python relacionadas con la prueba «parametrizadas»

    Leave a Comment