2012-09-25 16 views
7

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.

Respuesta

9

Entonces, nadie me ayudó con mi problema y decidí resolverlo yo solo. Here es una micro-lib llamada surrogate que permite crear stubs para módulos no existentes.

Lib se puede utilizar con mock como esto:

from surrogate import surrogate 
from mock import patch 

@surrogate('this.module.doesnt.exist') 
@patch('this.module.doesnt.exist', whatever) 
def test_something(): 
    from this.module.doesnt import exist 
    do_something() 

primer lugar @surrogate decorador crea talones para los módulos no existentes, entonces @patch decorador puede alterar ellos. Del mismo modo que los decoradores @patch, @surrogate se pueden usar "en plural", cortando así más de una ruta de módulo. Todos los talones existen solo durante la vida de la función decorada.

Si alguien tiene algún uso de esta lib, sería genial :)

Cuestiones relacionadas