Python argparse单元测试报错:TypeError参数数量不符求解
解决argparse单元测试中的TypeError问题
问题根源
你的单元测试报错TypeError: create() takes 1 positional argument but 2 were given,核心有三个问题:
create类方法定义时仅接收cls参数,但测试时传入了参数列表,导致参数不匹配argparse中设置了nargs=1,会让解析后的参数值变成列表类型,但你的NamedTuple字段定义的是str,类型不匹配- 原代码中
parse_args()默认读取系统命令行参数,单元测试时无法注入自定义测试参数
修复方案
1. 给create方法添加测试参数支持
在create方法中添加可选参数args,调用parse_args时传入该参数,这样单元测试可以自定义参数,正常运行时不传则自动读取命令行参数。
2. 修正参数类型不匹配问题
要么去掉add_argument中的nargs=1(默认就是读取单个值),要么在给NamedTuple赋值时取列表的第一个元素(比如arg.device[0])。
3. 单元测试无需额外调整
修复create方法后,原测试代码的传参方式即可正常工作。
修改后的代码
AppArguments类
from typing import NamedTuple import argparse class AppArguments(NamedTuple): device_name: str start_date: str end_date: str @classmethod def create(cls, args=None): # 添加可选参数args arg_parser = argparse.ArgumentParser(description="Description.") arg_parser.add_argument( '-d', '--device', help="Device name.", metavar='DEVICE_NAME', required=True ) arg_parser.add_argument( '-s', '--start', help="Starting date.", metavar='YEAR-MONTH-DAY', required=True ) arg_parser.add_argument( '-e', '--end', help="Ending date.", metavar='YEAR-MONTH-DAY', required=True ) # 传入args参数,测试时用自定义参数,正常运行时自动读取命令行 arg = arg_parser.parse_args(args) return cls(device_name=arg.device, start_date=arg.start, end_date=arg.end) def main(): arg = AppArguments.create() print(arg.device_name) if __name__ == "__main__": main()
单元测试类
import unittest from your_module import AppArguments # 替换成你的模块实际名称 class AppArgumentsTestCase(unittest.TestCase): def test_device_with_time(self): # given arguments = AppArguments.create(['-d', 'test_device', '-s', '2022-08-11', '-e', '2022-08-12']) # then self.assertEqual('test_device', arguments.device_name) self.assertEqual('2022-08-11', arguments.start_date) self.assertEqual('2022-08-12', arguments.end_date)
验证
运行单元测试后,不会再出现TypeError报错,同时参数类型也能匹配NamedTuple的定义,测试逻辑正常执行。
内容的提问来源于stack exchange,提问作者JabWik
相关产品推荐
相关产品推荐

