正确地模拟在另一个芹菜任务中调用的芹菜任务

时间:2017-08-11 13:16:22

标签: python python-2.7 mocking

如何正确模拟在另一个芹菜任务中调用的芹菜任务? (下面的虚拟代码)

@app.task
def task1(smthg):
    do_so_basic_stuff_1
    do_so_basic_stuff_2
    other_thing(smthg)

@app.task
def task2(smthg):
    if condition:
        task1.delay(smthg[1])
    else:
        task1.delay(smthg)

我在my_module中有完全相同的代码结构。凸出/ CEL / my_module.py 我正在尝试在proj / tests / cel_test / test.py

中编写测试

测试功能:

def test_this_thing(self):
    # firs I want to mock task1
    # i've tried to import it from my_module.py to test.py and then mock it from test.py namespace 
    # i've tried to import it from my_module.py and mock it
    # nothing worked for me

    # what I basically want to do 
    # mock task1 here
    # and then run task 2 (synchronous)
    task2.apply()
    # and then I want to check if task one was called 
    self.assertTrue(mocked_task1.called)

1 个答案:

答案 0 :(得分:2)

首先,测试Celery任务可能非常困难。我通常将我的所有逻辑放入一个不是任务的函数中,然后创建一个只调用该函数的任务,以便您可以正确地测试逻辑。

其次,我认为你不想在任务中调用任务(不确定,但我相信通常不建议这样做)。相反,根据您的需要,您可能应该进行链接或分组:

http://docs.celeryproject.org/en/latest/userguide/canvas.html#the-primitives

最后,要回答您的实际问题,您需要准确修补代码中delay方法的位置,如this post中所述。