【问题标题】:pytest-mock mock self methodpytest-mock 模拟自我方法
【发布时间】:2019-12-15 21:19:50
【问题描述】:

我正在尝试使用 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 ==

我也试过

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

但这给了我一个 AttributeError,正如我对 MagicMock 所期望的那样。

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

【问题讨论】:

  • 您要比较的是两个 mock 对象是否相同 - 它们不会是那样,因为您在第二次调用 MagicMock 时创建了一个新对象.您是否想比较对它们都调用 distance() 的结果,而不是它们是同一个实际对象?
  • @MatsLindh 我编辑了我的问题,添加了我想要实现的目标。我只想在我的 Interval 对象中测试我的 eq 函数。这就是我断言 i == i2 的原因。
  • 为什么不创建两个您知道相等的区间并进行比较?
  • 是的,我先试试这个。问题是我必须测试很多我已经在我的 distance() 方法中测试过的东西。所以我不想为 eq 写很多测试,因为我只知道它取决于 distance()。

标签: python pytest pytest-mock


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    这个例子只会测试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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      相关资源
      最近更新 更多