Python3 Unittest: как сравнивать с MagicMocks с помощью операторов - PullRequest
2 голосов
/ 29 марта 2019

Проще всего начать с примера ...

Пример кода для тестирования:

type1_instance1 = f1()
type1_instance2 = f2()

compareResult = type1_instance1 < type1_intstance2

if compareResult:
    print(type1_instance1.generate_value())

Экземпляры 1 и 2 являются экземплярами некоторого пользовательского класса.

В тесте f1 и f2 насмехаются над возвращением MagicMocks.Таким образом, для этих возвращаемых значений можно вызывать методы пользовательского класса.

При выполнении кода сравнения появляется ошибка

'<', которая не поддерживается между экземплярами MagicMock.'и' MagicMock '</p>

Как лучше всего включить 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

1 Ответ

1 голос
/ 29 марта 2019

Вместо этого следует переопределить атрибут return_value атрибута __lt__ объекта MagicMock и использовать patch, чтобы f1 и f2 вернули настроенный экземпляр 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
...