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

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.myapp.tasks, y se importa en la parte superior de mi archivo models.py así:

from .tasks import mytask

... y luego corresave() dentro del modelo usandomytask.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 (parcheandomyapp.models.mytask en cambio, y comprobando simock_task.delay fue llamado en su lugar. Recogí de los documentos simulados que la ruta de importación es crucial, y Google me dice que debería ser la ruta tal como se ve dentro del módulo bajo pruebas (que seríamyapp.models.mytask.delay más bien quemyapp.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? Podria parchearcelery.task (que se utiliza como decorador paramytask) en cambio?

Respuestas a la pregunta(2)

Su respuesta a la pregunta