Установка CELERY_ALWAYS_EAGER в True выдает ошибки
У меня есть некоторые асинхронные вызовы в моем коде. Как это:
send_message_to_install.delay(install, alert.message, badge, code,
campaign=alert.campaign, **kwargs)
Я не заинтересован в получении каких-либо результатов, просто важно, чтобы функция выполнялась синхронно во время выполнения тестов - без ошибок.
Во время тестирования я попытался установить CELERY_ALWAYS_EAGER в моем файле настроек на True:
if "test" in sys.argv:
CELERY_ALWAYS_EAGER = True
Я попытался установить это также в тестах:
from django.conf import settings
settings.CELERY_ALWAYS_EAGER = True
Обе попытки заставляют мои тесты выдавать ошибки (без ".delay" он работает нормально):
File "/opt/src/slicephone/cloud/users/api.py", line 520, in send_alert
campaign=alert.campaign, **kwargs)
File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/celery/app/task.py", line 357, in delay
return self.apply_async(args, kwargs)
File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/celery/app/task.py", line 463, in apply_async
options = router.route(options, self.name, args, kwargs)
File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/celery/app/routes.py", line 44, in route
route = self.lookup_route(task, args, kwargs)
File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/celery/app/routes.py", line 77, in lookup_route
return _first_route(self.routes, task, args, kwargs)
File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/celery/utils/functional.py", line 196, in _matcher
answer = getattr(maybe_promise(obj), method)(*args, **kwargs)
File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/kombu/utils/functional.py", line 50, in maybe_promise
return value.evaluate()
File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/celery/utils/functional.py", line 162, in evaluate
self._value = super(mpromise, self).evaluate()
File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/kombu/utils/functional.py", line 22, in evaluate
return self._fun(*self._args, **self._kwargs)
File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/celery/utils/imports.py", line 48, in instantiate
return symbol_by_name(name)(*args, **kwargs)
File "/opt/virtenvs/django_slice/local/lib/python2.7/site-packages/kombu/utils/__init__.py", line 80, in symbol_by_name
module = imp(module_name, package=package, **kwargs)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
ImportError: No module named tasks
Спасибо кев
2 ответа
Глупый я. В моем CELERY_ROUTES был "messages.tasks". Но нет файла /messages/tasks.py .
Вы можете использовать CeleryTestRunner для тестирования. Он автоматически запустит ваши тесты в режиме ALWAYS_EAGER