1

我正在尝试使用 pytest-mock 来模拟 self 方法。

只是我的班级有一个我想模拟的函数“距离”。

我想测试我的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 所期望的那样。

修补我的对象自我方法的正确方法是什么?

4

2 回答 2

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
于 2020-09-29T21:56:52.217 回答
0

您可以像这样轻松地模拟出距离方法。假设您的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
于 2020-10-01T12:23:54.167 回答