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

时间:2015-07-31 06:15:44

标签: python unit-testing celery pyramid pytest

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

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

def do_sth():
    logic();
    if condition:
         function1.apply_async(*args)
    else:
         function2.apply_asynch(*args)

现在我们要开始对我们编写的任何新代码进行单元测试,但我们不确定如何执行此操作。我们想在pytest单元测试中断言的是我们想看看function1是否真的被调用了。我们不一定要自己运行function1,因为我们会对function1进行单元测试。

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

这可以实现吗?

修改

有人指出这是How do you unit test a Celery task?

的副本

不是。想一想。我要问的是如何测试函数是否通过apply_async调用 function1 。这个问题是关于如何测试 function1 本身。有一个主要的区别。在构建这个问题之前,我确实遇到了这个问题。

1 个答案:

答案 0 :(得分:7)

查看Mock库,它允许替换您不希望使用"模拟"看起来与原始函数非常相似,以说服调用代码调用"真实的东西"。然后,您可以检查是否实际调用了模拟以及使用了哪些参数。例如:

import mock

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