Использование mock для исправления задачи сельдерея в модульных тестах Django
Я пытаюсь использовать библиотеку python mock для исправления задачи Celery, которая запускается при сохранении модели в моем приложении django, чтобы убедиться, что она вызывается правильно.
В основном, задача определяется внутриmyapp.tasks
и импортируется в начало моего файла models.py следующим образом:
from .tasks import mytask
... а затем работаетsave()
внутри модели с помощьюmytask.delay(foo, bar)
, Пока все хорошо - отлично работает, когда я на самом деле использую Celeryd и т. Д.
Я хочу создать модульный тест, который проверяет задачу, просто чтобы убедиться, что она вызывается с правильными аргументами и фактически не пытается запустить задачу Celery.
Итак, в тестовом файле у меня есть что-то вроде этого внутри стандартного 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)
... но это никогда не вызывается / всегда ложно. Я пробовал различные воплощения (исправленияmyapp.models.mytask
вместо этого, и проверка, еслиmock_task.delay
был назван вместо Я собрал из ложных документов, что путь импорта имеет решающее значение, и поиск в Google говорит мне, что это должен быть путь, как он виден внутри тестируемого модуля (который будетmyapp.models.mytask.delay
скорее, чемmyapp.tasks.mytask.delay
если я правильно понимаю).
Куда я здесь не так? Есть ли какие-то особые трудности в исправлении задач Celery? Могу ли я исправитьcelery.task
(который используется в качестве декоратора дляmytask
) вместо?