[英]python mock.mock_calls does not follow calls made inside @timeout decorated function
我正在对带有模拟的函数进行单元测试,并尝试测试是否对模拟对象进行了调用。 在requests.post
对象下面的代码中,我被模拟了,我跟踪了requests.post.mock_calls
列表。
在以下代码中
代码构造:
import timeout_decorator
def block_funds(trader_id, amounts):
@timeout_decorator.timeout(3, use_signals=False)
def _block_funds(block_url, amounts):
# requests.post.mock_calls empty here
result = requests.post(url=block_url, data=amounts)
# requests.post.mock_calls here has correct call recorded
return result.status_code
block_url = 'http:/someurl/somepath/{trader_id}'.format(trader_id=trader_id)
try:
# requests.post.mock_calls empty here
code = _block_funds(block_url, amounts)
# requests.post.mock_calls empty again here
except timeout_decorator.TimeoutError as ex:
logger.error('request failed')
code = 500
return code
在调用code = _block_funds(block_url, amounts)
我希望模拟对象保留对其的所有调用记录,但是一旦执行退出内部超时包装的函数_block_funds()
, mock_calls
列表就会被清空。 模拟对象肯定是相同的,我遵循模拟ID以确保对象未更改。
我在做错什么,以及如何使模拟不忘它的电话?
我发现了问题,它在超时装饰器中,尤其是在use_signals=False
部分中。 根据超时装饰器文档 ,要在我的场景(多线程Web应用程序)中正确使用超时,您无需使用信号,而是依靠多处理,在这种情况下,我看到了导致问题的意外模拟。 如果我删除use_signals=False
或完全删除装饰器-它将正常工作。
我现在的解决方案是模拟装饰器本身,并避免出现此问题。
更正
直接嘲弄装饰器被证明是不切实际的。 相反,我将其包裹起来并嘲弄了包裹:
def timeout_post(**kwargs):
@timeout_decorator.timeout(3, use_signals=False)
def _post(**kwargs):
return requests.post(**kwargs)
return _post(**kwargs)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.