2010-03-25 11 views
5

Ich habe eine Klasse:Wie mache ich eine Klasseneigenschaft mit mox?

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

mox und py.test verwenden, wie verspotten ich myproperty aus?

Ich habe versucht:

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

und

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

aber beide nicht mit AttributeError: can't set attribute.

+1

Verwenden Sie Großbuchstaben für Klassen. –

Antwort

9

Wenn Klasse Ausdrücken Attribute moxsetattr verwendet. So

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

entspricht

# 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) 

Beachten Sie, dass, weil myproperty ist eine Eigenschaft getattr und setattr wird der Unterkunft __get__ und __set__ Methoden werden aufgerufen wird, anstatt tatsächlich „verspotten out“ die Eigenschaft selbst.

Um also Ihr gewünschtes Ergebnis zu erhalten, gehen Sie nur einen Schritt tiefer und verspotten Sie die Eigenschaft auf der Klasse der Instanz.

mock.StubOutWithMock(myinstance.__class__, 'myproperty') 
myinstance.myproperty = 'goodbye' 

Beachten Sie, dass diese Probleme verursachen könnten, wenn Sie mit unterschiedlichen myproperty Werte gleichzeitig Mock mehrere Instanzen von MyClass wollen.

3

Haben Sie über property gelesen? Es ist schreibgeschützt, ein "Getter".

Wenn Sie einen Setter möchten, haben Sie zwei Möglichkeiten, wie Sie das erstellen können.

Sobald Sie beide Getter und Setter haben, können Sie erneut versuchen, beide zu verspotten.

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

Oder

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

Ja, ich hatte gehofft, dass ich die ursprüngliche Klasse nicht modifizieren könnte, vielleicht ist das aber nicht möglich. –

+2

Sie können nicht etwas verspotten, das nicht existiert. Die ursprüngliche Klasse konnte die Eigenschaft nicht festlegen. Sie können diese Funktion nicht vortäuschen, weil sie nicht existiert. –