python - 如何在 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)
解决方案
addTypeEqualityFunc
不是为改变比较逻辑而设计的。它旨在在发现不匹配时提供更详细的错误消息。API 的设计方式,将其用于子比较是没有意义的。
如果要修补类用于进行相等比较的逻辑,请使用以下方法修补__eq__
方法unittest.mock.patch
:
with patch.object(C, '__eq__', always_equal):
...
推荐阅读
- sql-server - SQL Server Management Studio 18.0 右键单击缺少任务选项
- c - Netbeans - 如何添加外部 C 库?IUP
- php - 在 Laravel 7 中验证失败时如何禁用严格重定向?
- python - 如何根据多个 if 条件在 pandas 中使用 Regex 提取字符串
- r - r 保留最近的(id)并为 NA 估算
- reactjs - Formik 的 setFieldValue 不适用于来自 Context API 的值
- node.js - 如何修复 v8 已弃用的 GetFunction?
- c - 从字符串数组中查找整数并使用创建的函数打印它
- c# - 安装 Unity.Mvc5 时出现问题 - UnityConfig.cs 文件丢失
- powershell - Powershell 计划任务仅运行“启动时”脚本的一部分。如果手动运行脚本运行良好