2010-03-25 22 views
5

Tôi có một lớp:Làm cách nào để giả lập thuộc tính lớp với mox?

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

Sử dụng moxpy.test, làm thế nào để tôi thử ra myproperty?

Tôi đã thử:

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

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

nhưng cả hai thất bại với AttributeError: can't set attribute.

+1

Vui lòng sử dụng Tên viết hoa phía trên cho Lớp học. –

Trả lời

9

Khi loại bỏ dần từng lớp thuộc tính mox sử dụng setattr. Như vậy

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

tương đương với

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

Lưu ý rằng vì myproperty là một tài sản getattrsetattr sẽ được gọi __get____set__ phương pháp của tài sản, chứ không phải là thực sự "chế giễu ra" tài sản riêng của mình.

Vì vậy, để có được kết quả mong muốn của bạn, bạn chỉ cần đi sâu hơn một bước và thử tài sản trên lớp của cá thể đó.

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

Lưu ý rằng điều này có thể gây ra vấn đề nếu bạn muốn đồng thời thử nhiều phiên bản MyClass với các giá trị myproperty khác nhau.

3

Bạn đã đọc khoảng property chưa? Đó là chỉ đọc, một "getter".

Nếu bạn muốn một người đặt cược, bạn có hai lựa chọn về cách tạo điều đó.

Khi bạn có cả getter và setter, bạn có thể thử lại để thử cả hai.

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

Hoặc

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

Vâng, tôi đã hy vọng để có được đi với không sửa đổi các lớp học ban đầu, có thể không được có thể mặc dù. –

+2

Bạn không thể chế giễu cái gì đó không tồn tại. Lớp gốc không thể có thuộc tính được đặt. Bạn không thể giả lập tính năng đó vì nó không tồn tại. –

Các vấn đề liên quan