Python单元测试断言失败:如何修正对象比较的断言语句
解决Python单元测试中对象实例比较断言失败的问题
方案一:重写FunctionOne的__eq__方法
Python默认用==比较对象的内存地址(即是否为同一个实例)。要让不同实例的FunctionOne根据属性相等被判定为相等,需在FunctionOne类中重写__eq__方法:
修改function_one.py:
class FunctionOne(Base): def __init__(self, amount, tax): super().__init__(amount, tax) def __eq__(self, other): # 先判断对方是否为FunctionOne实例 if not isinstance(other, FunctionOne): return False # 比较核心属性(假设Base类已将amount、tax作为实例属性保存) return self.amount == other.amount and self.tax == other.tax
同时修正测试中的方法调用错误(单下划线是保护方法,双下划线会触发名称修饰),原断言语句即可正常工作:
assert function_two._get_info() == FunctionOne(0,1)
方案二:直接比较对象属性(不修改原类)
如果不想改动原类代码,可在测试中直接验证返回对象的属性值,而非比较对象本身:
修改测试代码:
def test__get_info(self): a = "a" b = "b" c = "c" expected_amount = 0 expected_tax = 1 function_two = FunctionTwo(a, b, c) result = function_two._get_info() # 修正方法调用的下划线问题 # 用unittest断言方法更规范,也可使用普通assert self.assertEqual(result.amount, expected_amount) self.assertEqual(result.tax, expected_tax) # 普通assert写法: # assert result.amount == expected_amount and result.tax == expected_tax
额外注意事项
- 原代码中
FunctionTwo的类名拼写错误:Class应改为小写的class - 保护方法
_get_info不能用__get_info调用,双下划线开头的方法会被Python做名称修饰,无法直接通过原名称访问
内容的提问来源于stack exchange,提问作者Praveen
相关产品推荐
相关产品推荐

