大型Python CLI应用中用pytest Mock argparse的问题求助
问题:为eth-duties添加单元测试时遇到argparse导入错误
我正在开发eth-duties项目,前期为赶功能未编写单元测试,现在补加测试时碰到了棘手问题。
我在feature/add-unit-tests-intermediate-commit分支完成了一系列调整,使用poetry执行测试的命令是:
poetry run pytest --cov=duties tests/
基础单元测试tests/protocol/test_connection.py能正常运行,但tests/protocol/test_ethereum.py测试失败,核心问题出在argparse的导入逻辑上:
- 我要测试
duties.protocol.ethereum中的get_current_slot函数 - 测试中尝试Mock
duties.protocol.request里的send_beacon_api_request函数,但这个模块在导入阶段会实例化BeaconNode类 BeaconNode的初始化方法会调用get_arguments(),该函数最终会执行parser.parse_args(),导致pytest的命令行参数被当成应用自身的参数解析,触发报错
运行测试时的错误日志如下:
tests/protocol/test_ethereum.py:5: in <module> from duties.protocol.ethereum import get_current_slot duties/protocol/ethereum.py:12: in <module> from duties.protocol.request import CalldataType, send_beacon_api_request duties/protocol/request.py:18: in <module> beacon_node = BeaconNode() duties/protocol/connection.py:19: in __init__ self.__arguments = get_arguments() duties/cli/arguments.py:305: in get_arguments arguments = __get_raw_arguments() duties/cli/arguments.py:192: in __get_raw_arguments return parser.parse_args() /home/towo/miniconda3/envs/poetry-py312/lib/python3.12/argparse.py:1894: in parse_args self.error(msg % ' '.join(argv)) /home/towo/miniconda3/envs/poetry-py312/lib/python3.12/argparse.py:2655: in error self.exit(2, _('%(prog)s: error: %(message)s\n') % args) /home/towo/miniconda3/envs/poetry-py312/lib/python3.12/argparse.py:2642: in exit _sys.exit(status) E SystemExit: 2 -------------------------------------------------------------------------------------------------------- Captured stderr --------------------------------------------------------------------------------------------------------- usage: eth-duties [...options] eth-duties: error: unrecognized arguments: --cov=duties tests/
我已经尝试Mockget_arguments函数,这个方法在tests/protocol/test_connection.py里能正常工作,但在tests/protocol/test_ethereum.py里失效。我可能对pytest的Mock时机或作用范围理解有误,需要解决这个问题,而且项目里这类导入触发argparse解析的场景很多,希望能找到通用的解决方案。
内容的提问来源于stack exchange,提问作者Tobias
相关产品推荐
相关产品推荐

