Python 如何对运行芹菜任务的代码进行单元测试?

Python 如何对运行芹菜任务的代码进行单元测试?,python,unit-testing,celery,pyramid,pytest,Python,Unit Testing,Celery,Pyramid,Pytest,我正在使用的应用程序非常异步。web应用程序根据用户操作通过芹菜运行许多任务。芹菜任务本身能够启动进一步的任务 下面所示的代码经常出现在我们的代码库中 def do_sth(): logic(); if condition: function1.apply_async(*args) else: function2.apply_asynch(*args) 现在我们想开始单元测试我们编写的任何新代码,但我们不确定如何做到这一点。我们想在我

我正在使用的应用程序非常异步。web应用程序根据用户操作通过芹菜运行许多任务。芹菜任务本身能够启动进一步的任务

下面所示的代码经常出现在我们的代码库中

def do_sth():
    logic();
    if condition:
         function1.apply_async(*args)
    else:
         function2.apply_asynch(*args)
现在我们想开始单元测试我们编写的任何新代码,但我们不确定如何做到这一点。我们想在我们的
pytest
单元测试中断言的是,我们想看看function1是否真的被调用了。我们不需要运行
function1
本身,因为我们将对
function1
进行单元测试

我不想将芹菜作为一个进程运行,也不想在单元测试会话期间运行任何AMQP代理

这是可以实现的吗

编辑

有人指出,这是一个复制品

事实并非如此。想想看。我要问的是如何测试函数是否通过apply\u async调用了function1。这个问题是关于如何测试函数1本身。这是一个很大的区别。在构建这个函数之前,我确实遇到了这个问题。

看看这个模块,它允许用“mock”替换您不想被调用的函数,mock看起来与原始函数非常相似,从而使调用代码相信它调用的是“真实的东西”。然后,您可以检查是否实际调用了mock以及使用了哪些参数。例如:

from unittest.mock import patch

def test_do_sth():
    with patch('function1.apply_async') as function1_mock:
        do_sth()
        assert function1_mock.called

可能的重复不是重复我看到过这个问题,也不是我要问的。如果不清楚,请询问更多问题注意,您也可以使用
function1\u mock.assert\u called\u once\u with(*args)
来测试调用的数量,以及是否使用正确的参数调用。您还可以使用补丁作为测试函数的装饰器(在本例中,test\u do\u sth),这是我更喜欢的。