首页 > 解决方案 > 如何在 Python unittest 中添加用于集合比较的相等函数

问题描述

当我对一个类进行单元测试时,我想使用自定义比较功能。unittest 具有addTypeEqualityFunc但仅在直接比较两个对象时才有效。它不在集合内使用。有没有办法做到这一点?我的具体用例是使用MagicMock.assert_has_calls和比较调用的参数。

import unittest


class C:
    def __eq__(self, other):
        return False
        
        
def always_equal(this, that, msg=None):
    return True


class TestCase(unittest.TestCase):

    def test_without_equality_func(self):
        # This passses
        obj = C()
        self.assertEqual(obj, obj)
        
    def test_with_equality_func(self):
        # This fails
        self.addTypeEqualityFunc(C, always_equal)
        obj = C()
        self.assertEqual(obj, obj)      
        
    def test_in_list_with_equality_func(self):
        # This fails
        self.addTypeEqualityFunc(C, always_equal)
        l1 = [C()]
        l2 = [C()]
        self.assertEqual(l1, l2)

标签: pythonpython-unittest

解决方案


addTypeEqualityFunc不是为改变比较逻辑而设计的。它旨在在发现不匹配时提供更详细的错误消息。API 的设计方式,将其用于子比较是没有意义的。

如果要修补类用于进行相等比较的逻辑,请使用以下方法修补__eq__方法unittest.mock.patch

with patch.object(C, '__eq__', always_equal):
    ...

推荐阅读