我正在尝试使用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。
修补对象自我方法的正确方法是什么?
答案 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