unitarias software pruebas las integracion ingenieria funcionan ejemplo como python django unit-testing mocking celery

python - software - Usando el simulacro para parchear una tarea de apio en las pruebas unitarias de Django.



pruebas unitarias python (2)

El decorador @task reemplaza la función con un objeto de Task (ver documentation ). Si te burlas de la tarea en sí, reemplazarás el objeto de la Task (algo mágico) con un MagicMock y no programará la tarea en absoluto. En su lugar, simula el método run() del objeto Task , así:

@override_settings(CELERY_ALWAYS_EAGER=True) @patch(''monitor.tasks.monitor_user.run'') def test_monitor_all(self, monitor_user): """ Test monitor.all task """ user = ApiUserFactory() tasks.monitor_all.delay() monitor_user.assert_called_once_with(user.key)

Estoy tratando de usar la biblioteca simulada de python para parchear una tarea de apio que se ejecuta cuando se guarda un modelo en mi aplicación django, para ver que se está llamando correctamente.

Básicamente, la tarea se define dentro de myapp.tasks , y se importa en la parte superior de mi archivo models.py de la siguiente manera:

from .tasks import mytask

... y luego se ejecuta en save() dentro del modelo usando mytask.delay(foo, bar) . Hasta ahora, bien, funciona bien cuando en realidad estoy ejecutando Celeryd, etc.

Quiero construir una prueba de unidad que se burle de la tarea, solo para verificar que se llame con los argumentos correctos, y que en realidad nunca intente ejecutar la tarea de apio.

Así que en el archivo de prueba, tengo algo como esto dentro de un TestCase estándar:

from mock import patch # at the top of the file # ...then later def test_celery_task(self): with patch(''myapp.models.mytask.delay'') as mock_task: # ...create an instance of the model and save it etc self.assertTrue(mock_task.called)

... pero nunca se llama / siempre es falso. He intentado varias encarnaciones (parcheando myapp.models.mytask en myapp.models.mytask lugar, y verificando si se llamó a mock_task.delay su lugar. Recogí de los documentos falsos que la ruta de importación es crucial, y Google me dice que debería ser la ruta como se ve dentro del módulo bajo pruebas (que sería myapp.models.mytask.delay lugar de myapp.tasks.mytask.delay , si lo entiendo correctamente).

¿A dónde me voy mal aquí? ¿Hay algunas dificultades específicas para parchear las tareas de apio? ¿Podría parchear celery.task (que se usa como decorador para mytask ) en su lugar?


El problema que está teniendo no está relacionado con el hecho de que esta es una tarea de apio. Usted simplemente está parchando la cosa equivocada. ;)

Específicamente, debe averiguar qué vista u otro archivo está importando "mytask" y parchearlo allí, para que la línea relevante se vea así:

with patch(''myapp.myview.mytask.delay'') as mock_task:

Aquí hay algo más de sabor:

http://www.voidspace.org.uk/python/mock/patch.html#where-to-patch