2010-10-01 12 views

Respuesta

6

Para probar la unidad algo así, debe burlarse/anular sus dependencias. En este caso, digamos que está iniciando vim llamando a os.system ("vim").

En su prueba de unidad se puede apagar dicha llamada de función haciendo algo como:

def launchVim(): 
    os.system("vim") 

def testThatVimIsLaunched(): 
    try: 
     realSystem = os.system 
     called = [] 
     def stubSystem(command): 
      if command == "vim": 
       called.append(True) 
     os.system = stubSystem 

     launchVim() # function under test 

     assert(called == [True]) 
    finally: 
     os.system = realSystem 

Para más detalles sobre burlas y stubbing echar un vistazo a this article

Actualización: He añadido el try/finally para restaurar la función original del sistema como lo sugirió Dave Kirby

+0

Si haces esto, asegúrate de cerrar la llamada de una manera: finalmente: bloquea o usa setUp & tearDown para restaurar el sistema os.sys original después. De lo contrario, eventualmente escribirás una prueba en una parte no relacionada de tu conjunto de pruebas que intente llamar al sistema os real y te esté rascando la cabeza preguntándote por qué no funciona. –

+0

Monkey-patching de esta manera es bastante complicado. Si el código que se va a burlar ha conseguido una referencia al sistema os.system antes de parchearlo, la aplicación de parches no tendrá el efecto deseado. Además, esto es precisamente lo que hace el paquete simulado (por ahora incorporado), así que úselo en lugar :) Pero mi solución a continuación describe una forma de probar el código sin la necesidad de ningún parche –

4

Esto ya no es una prueba unitaria, sino una prueba de integración. ¿Por qué necesitas iniciar vim? Por lo general, se "burla" de esto, simula el proceso de desove y depende del hecho de que el módulo de subproceso de Python esté bien probado.

Para lograr esto en su código, puede, por ejemplo, subclasificar la clase que implementa su funcionalidad y anular el método que es responsable del desove. Luego prueba esta subclase. Es decir.

class VimSpawner(object): # your actual code, to be tested 
    ... 
    def spawn(self): 
     ... do subprocess magic 

    def other_logic(self): 
     ... 
     self.spawn() 

class TestableVimSpawner(VimSpawner): 
    def spawn(self): 
     ... mock the spawning 
     self.ididit = True 

class Test(..): 
    def test_spawning(self): 
     t = TestableVimSpawner() 
     t.other_logic() 
     self.failUnless(t.ididit) 
+0

¿Qué es 'iditit'? ? – GiantsLoveDeathMetal

+0

Es un error tipográfico :-) –

+0

¿Todavía no estoy seguro de lo que representa? – GiantsLoveDeathMetal

Cuestiones relacionadas