Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 芹菜中异步结果的单元测试_Python_Django_Unit Testing_Celery - Fatal编程技术网

Python 芹菜中异步结果的单元测试

Python 芹菜中异步结果的单元测试,python,django,unit-testing,celery,Python,Django,Unit Testing,Celery,我试图在Django的单元测试框架中测试一些芹菜功能,但每当我尝试检查AsyncResult时,测试就好像从未启动过一样 我知道这段代码在使用RabbitMQ的真实环境中工作,所以我只是想知道为什么在使用测试框架时它不工作 以下是一个例子: @override_settings(CELERY_EAGER_PROPAGATES_EXCEPTIONS = True, CELERY_ALWAYS_EAGER = True, B

我试图在Django的单元测试框架中测试一些芹菜功能,但每当我尝试检查AsyncResult时,测试就好像从未启动过一样

我知道这段代码在使用RabbitMQ的真实环境中工作,所以我只是想知道为什么在使用测试框架时它不工作

以下是一个例子:

@override_settings(CELERY_EAGER_PROPAGATES_EXCEPTIONS = True,
                   CELERY_ALWAYS_EAGER = True,
                   BROKER_BACKEND = 'memory',)
def test_celery_do_work(self):
    result = myapp.tasks.celery_do_work.AsyncResult('blat')
    applied_task = myapp.tasks.celery_do_work.apply_async((), task_id='blat')
    applied_task.wait()
    # THIS SUCCEEDS
    self.assertTrue(applied_task.successful())
    # THIS FAILS
    self.assertTrue(result.successful())
由于AsyncResult功能立即执行,使用ALWAYS_EAGER选项是否会禁用它?如果是这样,是否有任何方法可以进行单元测试异步结果状态检查?如果我尝试取消“总是渴望”选项,测试将永远不会运行,因此我会不知所措


谢谢

cellery\u ALWAYS\u EAGER
True
时,对
apply\u async()
的调用实际上被
apply()
替换。返回的结果是一个
结果
,它已经包含任务的结果

因此,是的,设置
ALWAYS\u EAGER=True
将禁用整个
AsyncResult
功能。整个异步过程被绕过,实际上没有任务发送到代理,这就是为什么不能通过
AsyncResult
检索结果

当您测试只需要芹菜结果的代码路径时,请使用
CELERY\u ALWAYS\u EAGER=True
,并以同样的方式处理
EakerResult
AsyncResult


如果需要,也可以使用
AsyncResult
CELERY\u ALWAYS\u Earge=False
运行测试,但为此,您需要在调用测试用例中的任务之前启动工作程序。然后,工人将能够执行您的任务,
AsyncResult
将正常工作。您可以看看哪个似乎就是这样做的,尽管我没有测试过它。

我想它可能是这样的,但不知道这个对象。我以为他们永远都是不一样的。谢谢你的信息!我建议从单元测试本身开始阅读。