He escrito una función que abre un editor vim con el nombre de archivo dado cuando se llama ... ¿Cómo puedo hacer la prueba unitaria de estos tipos de operaciones ...unidad probando una función python que invoca un subproceso vim
Respuesta
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
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)
¿Qué es 'iditit'? ? – GiantsLoveDeathMetal
Es un error tipográfico :-) –
¿Todavía no estoy seguro de lo que representa? – GiantsLoveDeathMetal
- 1. Unidad probando una aplicación multiproceso?
- 2. Unidad probando una aplicación Http
- 3. Unidad probando una aplicación Firemonkey
- 4. Unidad probando un repositorio LINQ2SQL
- 5. Python - ¿Existe una función que se invoca cuando un objeto no implementa una función?
- 6. Unidad probando una clase que hereda de una clase abstracta
- 7. Unidad probando una clase de aplicación Flask
- 8. Unidad probando una aplicación basada en temporizador?
- 9. Unidad probando un método con comportamiento aleatorio
- 10. unidad probando un método de fábrica
- 11. Unidad probando un método con Moq
- 12. Unidad probando un método de controlador?
- 13. Unidad probando una aplicación de Python que usa la biblioteca de solicitudes
- 14. Unidad probando el uso de TransactionScope
- 15. MVC - Unidad probando las cosas incorrectas?
- 16. Unidad probando el archivo app.config con NUnit
- 17. anotación que invoca un método
- 18. Unidad probando una capa de acceso a datos
- 19. Unidad probando clases no exportadas en una DLL
- 20. subproceso python que utiliza el subproceso de importación
- 21. Buscando dirección en la unidad probando una extensión de controlador que rinde una vista parcial
- 22. Unidad probando un enlace de datos en WPF
- 23. Boolean probando una lista en Python
- 24. Python subproceso Ayuda
- 25. ¿Puedo probar la unidad una función interna en python?
- 26. programa que invoca cuando una función fiesta tiene el mismo nombre
- 27. En Python 2.5, ¿cómo elimino un subproceso?
- 28. Subproceso de Python con redirección stdout que devuelve un int
- 29. probando que una actividad llamada setResult
- 30. ¿Qué hay de malo en hacer que un examen de unidad sea un amigo de la clase que está probando?
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. –
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 –