Метод самопознания
Я пытаюсь издеваться над собственным методом, используя pytest-mock.
Просто мой класс получил функцию "расстояние", которую я хочу издеваться.
Я хочу проверить мою функцию eq, как это:
def __eq__(self, other):
return self.distance() == other.distance()
Я пытаюсь что-то вроде этого:
def test_eq(mocker):
i = mocker.MagicMock(Interval)
mocker.patch.object(i, 'distance', return_value=1)
i2 = mocker.MagicMock(Interval)
mocker.patch.object(i2, 'distance', return_value=1)
assert i == i2
Но это возвращение:
AssertionError: assert <\ MagicMock spec = 'Interval' id = '140333310434384'> ==<\ MagicMock spec = 'Interval' id = '140333310558104'>
Я также пытался
mocker.patch.object(i, 'self.distance', return_value=1)
но это дает мне AttributeError, как я и ожидал от MagicMock.
Как правильно исправить свой объектный метод?
0 ответов
Не думаю, что можно вот так патчить "Интервал". Вместо этого вам следует исправить конструктор и вручную заменить функции расстояния, чтобы они возвращали ожидаемые результаты.
В этом примере будет проверяться только
Interval.__eq__
метод:
def test_eq(mocker):
# Mock constructor as it is already tested elsewhere
mocker.patch.object(Interval, "__init__", return_value=None)
i1 = Interval()
i1.distance = lambda: 1
i2 = Interval()
i2.distance = lambda: 1
assert i1 == i2
Вы можете легко смоделировать метод расстояния, подобный этому. Предполагая, что ваш
Interval
класс определен в модуле интервала, например, так:
class Interval:
def __eq__(self, other):
return self.distance() == other.distance()
def distance(self):
raise NotImplementedError()
Затем в своем тесте вы можете просто имитировать функцию расстояния, чтобы всегда возвращать 1 следующим образом:
from interval import Interval
def test_eq(mocker):
mocker.patch('interval.Interval.distance', return_value=1)
i1 = Interval()
i2 = Interval()
assert i1 == i2