Python3 单元测试:如何使用运算符与 MagicMocks 进行比较

Python3 Unittest: How to compare with MagicMocks Using Operators

最简单的事情就是从一个例子开始...

要测试的示例代码:

type1_instance1 = f1()
type1_instance2 = f2()

compareResult = type1_instance1 < type1_intstance2

if compareResult:
    print(type1_instance1.generate_value())

实例 1 和实例 2 是一些自定义 class 的实例。

在测试时 f1f2 被模拟为 return MagicMocks。这样自定义 class 的方法可以在那些 returned 值上调用。

执行比较代码时出现错误

'<' not supported between instances of 'MagicMock' and 'MagicMock'

使 MagicMocks 与重载运算符一起工作的最佳方法是什么?

这是我的解决方案:

def __lt__(self, other):
    return mock.MagicMock

compareable_MagicMock_Instance = MagicMock()
setattr(compareable_MagicMock_Instance, '__lt__', __lt__)

f1.return_value = compareable_MagicMock_Instance
f2.return_value = another_compareable_MagicMock_Instance

您应该改写 MagicMock 对象的 __lt__ 属性的 return_value 属性,并使用 patch 使 f1f2 return 自定义 MagicMock 实例:

from unittest.mock import patch, MagicMock
def f1():
    pass
def f2():
    pass
compareable_MagicMock_Instance = MagicMock()
compareable_MagicMock_Instance.__lt__.return_value = True
with patch('__main__.f1', return_value=compareable_MagicMock_Instance), patch('__main__.f2', return_value=compareable_MagicMock_Instance):
    type1_instance1 = f1()
    type1_instance2 = f2()
    compareResult = type1_instance1 < type1_instance2
    if compareResult:
        print('type1_instance1 is less than type1_instance2')

这输出:

type1_instance1 is less than type1_instance2