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.tasksi 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?

questionAnswers(2)

yourAnswerToTheQuestion