我正在处理的应用程序非常异步。 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 本身。有一个主要的区别。在构建这个问题之前,我确实遇到了这个问题。
答案 0 :(得分:7)
查看Mock库,它允许替换您不希望使用"模拟"看起来与原始函数非常相似,以说服调用代码调用"真实的东西"。然后,您可以检查是否实际调用了模拟以及使用了哪些参数。例如:
import mock
def test_do_sth():
with mock.patch('function1.apply_async') as function1_mock:
do_sth()
assert function1_mock.called