pytest-mock模拟自我方法

时间:2019-08-08 08:03:37

标签: python pytest pytest-mock

我正在尝试使用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:断言<\ MagicMock spec ='Interval'id ='140333310434384'> == <\ MagicMock spec ='Interval'id ='140333310558104'>

我也尝试过

mocker.patch.object(i, 'self.distance', return_value=1)

但是这给了我MagicMock期望的AttributeError。

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

2 个答案:

答案 0 :(得分:0)

我认为您不能像这样修补“间隔”。相反,您应该修补构造函数并手动替换distance函数以返回预期结果。

此示例将仅测试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

答案 1 :(得分:0)

您可以像这样轻松地模拟距离方法。 假设您的Interval类是在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