Pytest测试FastAPI中MyClass出现意外关键字参数错误
问题分析与解决方案
问题核心
定义的MyClass在FastAPI正常运行时实例化无异常,但使用Pytest测试时抛出TypeError: MyClass.__init__() got an unexpected keyword argument 'api_key',清理缓存后问题仍存在。
排查与解决步骤
1. 确认导入的MyClass版本正确性
最可能的原因是测试代码导入的MyClass并非你编写的目标版本。在测试代码开头添加调试代码,验证方法签名:
from myclass import MyClass import inspect # 打印MyClass.__init__的参数签名,确认是否包含api_key print(inspect.signature(MyClass.__init__)) # 打印模块路径,确认导入的是目标文件 import myclass print("MyClass所在模块路径:", myclass.__file__)
- 如果签名中没有
api_key,检查是否存在同名模块(如第三方库中的myclass),或目标myclass.py是否在Python可导入路径中。 - 如果模块路径不是你编写的文件,调整Pytest运行的工作目录,或修改导入语句使用绝对路径。
2. 修复测试代码的变量名冲突
测试代码中存在变量名重复覆盖的问题,虽然不是当前错误的直接原因,但会导致后续逻辑混淆:
# 原代码 client = MyClass(...) # 修改为 my_class_instance = MyClass( api_key="<API_KEY>", root_url="http://localhost:8080", headers=["authorization", "content-type", "connection"], fields_one=["name", "email"], fields_two=["password", "phone"], debug=True ) app.middleware('http')(my_class_instance.middleware) # 后续TestClient实例保留原变量名 client = TestClient(app)
3. 修复MyClass的可变默认参数隐患
虽然不影响当前错误,但__init__中使用可变对象(如列表)作为默认参数会导致多实例共享同一对象的意外问题,建议修改:
class MyClass: def __init__(self, api_key, debug=False, root_url="https://app.apitoolkit.io", headers=None, fields_one=None, fields_two=None): # 安全设置默认值 headers = headers or ['authorization', 'cookie'] fields_one = fields_one or [] fields_two = fields_two or [] print(api_key, debug, root_url, headers, fields_one, fields_two)
4. 检查循环导入问题
如果myclass.py与测试文件存在循环导入,会导致模块加载异常。检查myclass.py的导入语句,确保无循环依赖。
内容的提问来源于stack exchange,提问作者devGrammer
相关产品推荐
相关产品推荐

