2014-10-10 5 views
0

Я столкнулся с некоторыми проблемами, вытекающими из факта, чем несколько всех моксов. Объект Mock данного класса кажется равным в значении ==, __eq__, хотя они разные объекты (по крайней мере mock1 is mock2 возвращает False). есть ли способ предотвратить это поведение?При использовании pockon mox mock objects существует ли способ избежать того, чтобы все они были равны (как в __eq__)?

В примере кода ниже вы можете увидеть, что счетчик не так, потому что он думает, что все издевается равны:

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 

ответ

0

Представляется, что реализация __eq__ для mox.MockAnything и mox.MockObject просто сравнивает 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) 

Это имеет несколько последствий, когда издевается используются в коллекциях методов, таких как list.remove() и т.д.

Вы должны добавить некоторые звонки на фальшивый метод, чтобы сделать издевается не равны в глазах __eq__ ,