我遇到了一些问题,这些问题源于一个给定类的几个全mox Mock对象在==
、__eq__
意义上似乎是相等的,尽管它们是不同的对象(至少mock1 is mock2
返回False
)。有什么办法可以防止这种行为吗?
在下面的代码示例中,您可以看到计数是错误的,因为它认为所有模拟都是相等的:
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
mox.MockAnything
和mox.MockObject
的__eq__
的实现似乎只是比较了replay_mode
和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)
当mock用于list.remove()
等方法的集合时,这有几个含义。
您必须添加一些对fake方法的调用,以使mock在__eq__
眼中不相等。