2010-03-25 2 views
5

У меня есть класс:Как мне высмеять свойство класса с помощью mox?

class MyClass(object): 
    @property 
    def myproperty(self): 
     return 'hello' 

Использование mox и py.test, как я дразнить из myproperty?

Я пробовал:

mock.StubOutWithMock(myclass, 'myproperty') 
myclass.myproperty = 'goodbye' 

и

mock.StubOutWithMock(myclass, 'myproperty') 
myclass.myproperty.AndReturns('goodbye') 

, но и не в состоянии с AttributeError: can't set attribute.

+1

Пожалуйста, используйте имена верхнего класса для классов. –

ответ

9

Когда гася атрибутов класса 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 значениями.

3

Вы прочитали: property? Это только для чтения, «getter».

Если вы хотите установить сеттер, у вас есть два варианта создания этого.

Как только у вас есть и геттер, и сеттер, вы можете попробовать еще раз издеваться над обоими из них.

class MyClass(object): # Upper Case Names for Classes. 
    @property 
    def myproperty(self): 
     return 'hello' 
    @myproperty.setter 
    def myproperty(self,value): 
     self.someValue= value 

Или

class MyClass(object): # Upper Case Names for Classes. 
    def getProperty(self): 
     return 'hello' 
    def setProperty(self,value): 
     self.someValue= value 
    myproperty= property(getProperty, setProperty) 
+0

Да, я надеялся уйти с изменением первоначального класса, возможно, это будет невозможно. –

+2

Вы не можете издеваться над тем, чего не существует. Первоначальный класс не может иметь свойство. Вы не можете издеваться над этой функцией, потому что ее не существует. –

Смежные вопросы