Метод самопознания

Я пытаюсь издеваться над собственным методом, используя 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
Другие вопросы по тегам