Verwenden von Mock, um eine Sellerie-Aufgabe in Django-Unit-Tests zu patchen

Ich versuche, mithilfe der Python-Mock-Bibliothek eine Sellerie-Task zu patchen, die ausgeführt wird, wenn ein Modell in meiner Django-App gespeichert wird, um sicherzustellen, dass es korrekt aufgerufen wird.

Grundsätzlich ist die Aufgabe im Inneren definiertmyapp.tasks, und wird am oberen Rand meiner models.py-Datei wie folgt importiert:

from .tasks import mytask

... und läuft dann weitersave() innerhalb des Modells mitmytask.delay(foo, bar). So weit so gut - funktioniert gut, wenn ich tatsächlich Celeryd usw. betreibe.

Ich möchte einen Komponententest erstellen, der die Aufgabe verspottet, nur um zu überprüfen, ob sie mit den richtigen Argumenten aufgerufen wird, und nicht wirklich versucht, die Sellerie-Aufgabe jemals auszuführen.

In der Testdatei habe ich so etwas in einem Standard-Testfall:

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)

... aber es wird nie aufgerufen / ist immer falsch. Ich habe verschiedene Inkarnationen ausprobiert (Patchen)myapp.models.mytask stattdessen und überprüfen, obmock_task.delay wurde stattdessen aufgerufen. Ich habe aus den nachgebildeten Dokumenten erfahren, dass der Importpfad von entscheidender Bedeutung ist, und Googeln sagt mir, dass es der Pfad sein sollte, wie er im getesteten Modul zu sehen ist (das wäremyapp.models.mytask.delay eher, alsmyapp.tasks.mytask.delaywenn ich es richtig verstehe).

Wo gehe ich hier falsch? Gibt es bestimmte Schwierigkeiten beim Patchen von Sellerietasks? Könnte ich flickencelery.task (die als Dekorateur verwendet wird, ummytask) stattdessen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage