0

我遇到了一些问题,尽管它们是不同的对象(至少返回),但给定类的几个所有 mox Mock 对象似乎在==意义__eq__mock1 is mock2False相等的。有什么办法可以防止这种行为?

在下面的代码示例中,您可以看到计数是错误的,因为它认为所有的模拟都是相等的:

import mox

class MyClass(object):
    pass

real1 = MyClass()
real2 = MyClass()
listreal = (real1, real2)
mocker = mox.Mox()
mock1 = mocker.CreateMock(MyClass)
mock2 = mocker.CreateMock(MyClass)
listmock = (mock1, mock2)

real1 == real2  # False
real1 is real2  # False
listreal.count(real1)  # 1
mock1 == mock2  # True
mock1 is mock2  # False
listmock.count(mock1)  # 2
4

1 回答 1

0

似乎__eq__for mox.MockAnythingand的实现mox.MockObject只是比较 thereplay_mode和 the ,expected_calls_queue因此任何期望相同调用的模拟对象实际上是“相等的”。

class MockAnything:
  def __eq__(self, rhs):
    """Provide custom logic to compare objects."""

    return (isinstance(rhs, MockAnything) and
            self._replay_mode == rhs._replay_mode and
            self._expected_calls_queue == rhs._expected_calls_queue)

当模拟用于诸如list.remove()等方法的集合中时,这有几个含义。

您必须添加一些对假方法的调用,以使模拟在__eq__.

于 2014-10-12T17:56:16.160 回答