使用Pytest测试Python子类时出现父类属性未找到的AttributeError
解决Pytest测试子类时父类属性AttributeError异常
核心问题原因
你的代码存在三个关键语法/逻辑错误,直接触发了AttributeError:
- 父类
Entity的构造函数名拼写错误:__init_少了一个下划线,应为__init__,导致子类调用super().__init__()时无法触发父类构造逻辑,self.errors和self.id从未被初始化。 - 子类
Product的__init__方法缺少self参数,这是Python类方法的必填绑定参数,缺失会导致实例属性无法正确关联。 - 调用
validate_is_datetime时参数不匹配:父类方法需要attr_name和attr_value两个参数,但你仅传入了一个值。
修正后的代码
entity.py(修复构造函数与语法错误)
from abc import ABC import uuid from datetime import datetime # 包含基础验证布尔函数的工具类,例如:is_valid_datetime from util import Validator class Entity(ABC): id: str errors: list[dict] # 修正构造函数命名 def __init__(self) -> None: self.id = "" self.errors = [] if not self.id: self.id = uuid.uuid4().hex self.validate() def validate(self) -> None: if len(self.errors) > 0: raise ValueError(self.errors) # 修正条件语句冒号缺失问题,补充返回值 def validate_is_datetime(self, attr_name: str, attr_value: datetime) -> bool: if Validator.is_valid_datetime(attr_value): return True else: self.errors.append( { "type": "datetime", "loc": f"Entity, {attr_name}", "msg": "Attribute should be a valid datetime", "input": attr_value } ) return False
product.py(修复__init__参数与方法调用)
from entity import Entity class Product(Entity): name: str price: str # 补充self参数,修正验证方法调用参数 def __init__(self, name: str, price: str) -> None: self.name = name # 传递属性名与属性值两个参数 self.validate_is_datetime("name", self.name) self.price = price super().__init__()
测试验证
修正后运行pytest,会触发预期的ValueError(因字符串类型的name不满足日期格式验证),而非AttributeError。若需专门测试验证失败场景,可添加如下用例:
import pytest from product import Product def test_product_invalid_name_raises_value_error(): with pytest.raises(ValueError) as excinfo: Product(name="Iphone 8", price="150") assert len(excinfo.value.args[0]) > 0 assert excinfo.value.args[0][0]["msg"] == "Attribute should be a valid datetime"
内容的提问来源于stack exchange,提问作者Madu Ezekias
相关产品推荐
相关产品推荐

