Easiest thing is to start with an example...
Example code to put under test:
type1_instance1 = f1()
type1_instance2 = f2()
compareResult = type1_instance1 < type1_intstance2
if compareResult:
print(type1_instance1.generate_value())
Instance 1 and 2 are instances of some custom class.
When under test f1 and f2 are mocked to return MagicMocks. So that methods of the custom class can be called on those returned values.
When the compare code is executed I get the error
'<' not supported between instances of 'MagicMock' and 'MagicMock'
What's the best way to enable MagicMocks to work with overloaded operators?
Here was my solution:
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
You should override the return_value attribute of the __lt__ attribute of the MagicMock object instead, and use patch to make f1 and f2 return the customized MagicMock instance:
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')
This outputs:
type1_instance1 is less than type1_instance2
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With