gpt4 book ai didi

python - 使用补丁在 Python 中模拟 Celery 任务调用

转载 作者:太空狗 更新时间:2023-10-30 00:55:57 25 4
gpt4 key购买 nike

使用模拟返回值修补 Celery 任务调用返回 <Mock name='mock().get()' ...>而不是预期的 return_valuemock_task.get.return_value = "value" 定义.但是,模拟任务在我的单元测试中正常运行。

这是我修补 Celery 任务的单元测试:

def test_foo(self):

mock_task = Mock()
mock_task.get = Mock(return_value={'success': True})

print mock_task.get() # outputs {'success': True}

with patch('app.tasks.my_task.delay', new=mock_task) as mocked_task:
foo() # this calls the mocked task with an argument, 'input from foo'
mock_tasked.assert_called_with('input from foo') # works

下面是正在测试的函数:

def foo():
print tasks.my_task.delay # shows a Mock object, as expected
# now let's call get() on the mocked task:
task_result = tasks.my_task.delay('input from foo').get()
print task_result # => <Mock name='mock().get()' id='122741648'>
# unexpectedly, this does not return {'success': True}
if task_result['success']:
...

最后一行引发TypeError: 'Mock' object has no attribute '__getitem__'

为什么我可以从我的单元测试中调用 mock_task.get(),但从 foo 调用它返回 <Mock ...>而不是预期的返回值?

最佳答案

不幸的是,我对 Celery 几乎一无所知,但看起来问题出在模拟上。

你有:

tasks.my_task.delay('input from foo').get()

patch('app.tasks.my_task.delay', new=mock_task) 之后变成:

mock_task('input from foo').get()

这与以下内容不同:

mock_task.get()

您应该将模拟创建更改为:

mock_task().get = Mock(return_value={'success': True})

当您访问现有的 Mock 属性或调用它时,默认情况下会创建新的 Mock 实例。所以我们可以稍微简化一下:

mock_task().get.return_value = {'success': True}

关于python - 使用补丁在 Python 中模拟 Celery 任务调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22683188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com