При заглушении атрибутов класса mox
использует setattr
.Таким образом,
mock.StubOutWithMock(myinstance, 'myproperty')
myinstance.myproperty = 'goodbye'
эквивалентно
# Save old attribute so it can be replaced during teardown
saved = getattr(myinstance, 'myproperty')
# Replace the existing attribute with a mock
mocked = MockAnything()
setattr(myinstance, 'myproperty', mocked)
Обратите внимание, что, поскольку myproperty
является свойством getattr
, а setattr
будет вызывать свойства __get__
и __set__
методы, вместо того, чтобы фактически «издеваться» над самим свойством.
Таким образом, чтобы получить желаемый результат, вы просто идете на один шаг глубже и макете свойство в классе экземпляра.
mock.StubOutWithMock(myinstance.__class__, 'myproperty')
myinstance.myproperty = 'goodbye'
Обратите внимание, что это может вызвать проблемы, если вы хотите одновременно смоделировать несколько экземпляров MyClass с различными значениями myproperty
.