使用带有Python mock的生成器来复制服务器响应



我想使用列表(转换为生成器)作为我的API调用的模拟(使用unittest.mock)。我的功能是:

def monitor_order(order_id)
order_info = client.get_order_status(order_id)
order_status = order_info['status']
while order_status != 'filled':
print('order_status: ', order_status)
time.sleep(5)
order_info = client.get_order_status(order_id)
order_status = order_info['status']
return order_info
我的测试函数是:
@patch('my_package.client.get_order_status')
def test_monitor_order(mocked_get_order_status):
order_states = [
dict(status='open'),
dict(status='open'),
dict(status='filled'),
]
# Make into a generator
status_changes = (status for status in order_states)
mocked_get_order_status.return_value = next(order_states)
# Execute function to test
monitor_order("dummy_order")

但是,在执行测试时,我可以看到状态总是'open':

order_status:  open
order_status:  open
order_status:  open

我想我明白为什么它是错误的,但是我怎样才能正确地实现它?

要达到您想要的效果,您可以这样重写您的测试:

@patch('my_package.client.get_order_status')
def test_monitor_order(mocked_get_order_status):
order_states = [
dict(status='open'),
dict(status='open'),
dict(status='filled'),
]
mocked_get_order_status.side_effect = order_states
# Execute function to test
monitor_order("dummy_order")

相关内容

  • 没有找到相关文章

最新更新