【发布时间】:2018-05-08 21:18:15
【问题描述】:
我正在使用 mock 对函数进行单元测试,并尝试测试是否调用了 mock 对象。在下面的代码中,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 列表就会被清空。 Mock 对象当然是一样的,我会按照 mock 的 ID 来确保对象没有改变。
我做错了什么以及如何让模拟不会忘记它的调用?
【问题讨论】:
-
您在测试中用于比较的模拟对象和您在函数中测试值的模拟对象可能不是同一个对象。在您的问题中包含您的测试功能。
-
其实我找到了原因——它是
@timeout装饰器。不,对象是相同的,我正在关注模拟对象 ID,但我发现只要我注释掉超时装饰器 - 调用就会出现并且测试通过。我现在必须弄清楚如何为测试解决这个问题。
标签: python unit-testing mocking