繁体   English   中英

python mock.mock_calls不跟随在@timeout装饰函数内部进行的调用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM