Supongamos que tenemos un sistema de módulos que existe solo en la etapa de producción. En el momento de la prueba, estos módulos no existen. Pero aún me gustaría escribir pruebas para el código que usa esos módulos. Supongamos también que sé cómo simular todos los objetos necesarios de esos módulos. La pregunta es: ¿cómo puedo convenientemente agregar talones del módulo en la jerarquía actual?¿Cómo me burlo de la jerarquía de módulos no existentes?
Aquí hay un pequeño ejemplo. La funcionalidad Quiero ensayo se coloca en un archivo llamado actual.py
:
actual.py:
def coolfunc():
from level1.level2.level3_1 import thing1
from level1.level2.level3_2 import thing2
do_something(thing1)
do_something_else(thing2)
En mi banco de pruebas ya tengo todo lo que necesito: tengo thing1_mock
y thing2_mock
. También tengo una función de prueba. Lo que necesito es agregar level1.level2...
en el sistema de módulo actual. De esta manera:
tests.py
import sys
import actual
class SomeTestCase(TestCase):
thing1_mock = mock1()
thing2_mock = mock2()
def setUp(self):
sys.modules['level1'] = what should I do here?
@patch('level1.level2.level3_1.thing1', thing1_mock)
@patch('level1.level2.level3_1.thing1', thing2_mock)
def test_some_case(self):
actual.coolfunc()
Sé que puedo sustituir sys.modules['level1']
con un objeto que contiene otro objeto y así sucesivamente. Pero parece mucho código para mí. Supongo que debe haber una solución mucho más simple y bonita. Simplemente no puedo encontrarlo.