22👍
When CELERY_ALWAYS_EAGER
is True
, the call to apply_async()
is actually replaced with apply()
. The result returned is an EagerResult
, which already contains the result of your task.
So, yes, setting ALWAYS_EAGER = True
disables the entire AsyncResult
functionnality. The entire async process is bypassed, and no task is actually sent to the broker, which is why you cannot retrieve the result through an AsyncResult
.
Use CELERY_ALWAYS_EAGER = True
when you are testing code path which just need a Celery result, and work the same way with an EagerResult
or an AsyncResult
.
If needed, there is a way to run tests with AsyncResult
too, with CELERY_ALWAYS_EAGER = False
, but for this, you’ll need to start a worker before calling the task in your test case. The worker will then be able to execute your task, and AsyncResult
will work just fine. You can take a look at django-celery-testworker which seems to do just that, although I’ve not tested it.