Używanie makiety do łatania zadania selera w testach jednostkowych Django
Próbuję użyć biblioteki próbnej Pythona do załatania zadania Celery, które jest uruchamiane, gdy model jest zapisywany w mojej aplikacji django, aby zobaczyć, że jest poprawnie wywoływany.
Zasadniczo zadanie jest zdefiniowane wewnątrzmyapp.tasks
i jest importowany na górze mojego pliku models.py w ten sposób:
from .tasks import mytask
... a następnie uruchamia sięsave()
wewnątrz modelu za pomocąmytask.delay(foo, bar)
. Do tej pory tak dobrze - działa dobrze, gdy faktycznie używam Celeryd itp.
Chcę skonstruować test jednostkowy, który drwi z zadania, tylko po to, by sprawdzić, czy zostanie wywołany z poprawnymi argumentami, i nie próbuje nigdy uruchomić zadania Selera.
W pliku testowym mam coś takiego w standardowej TestCase:
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)
... ale nigdy nie zostanie wywołany / jest zawsze fałszywy. Próbowałem różnych inkarnacji (łataniemyapp.models.mytask
zamiast tego i sprawdzanie, czymock_task.delay
zamiast tego został wywołany. Zebrałem z fałszywych dokumentów, że ścieżka importu jest kluczowa, a googling mówi mi, że powinna to być ścieżka, która jest widoczna w testowanym module (co byłobymyapp.models.mytask.delay
zamiastmyapp.tasks.mytask.delay
, jeśli dobrze to rozumiem).
Gdzie się mylę? Czy są jakieś szczególne trudności z łataniem zadań Celery? Mogę załataćcelery.task
(który jest używany jako dekorator domytask
) zamiast?