You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

大型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函数
  • 测试中尝试Mockduties.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 01:15:01