首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何用mox模拟一个类属性?

我如何用mox模拟一个类属性?
EN

Stack Overflow用户
提问于 2010-03-25 08:48:25
回答 2查看 5.9K关注 0票数 5

我有一门课:

代码语言:javascript
复制
class MyClass(object):
    @property
    def myproperty(self):
        return 'hello'

如何使用moxpy.test模拟myproperty

我试过了:

代码语言:javascript
复制
mock.StubOutWithMock(myclass, 'myproperty')
myclass.myproperty = 'goodbye'

代码语言:javascript
复制
mock.StubOutWithMock(myclass, 'myproperty')
myclass.myproperty.AndReturns('goodbye')

但使用AttributeError: can't set attribute时,这两种方法都失败了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-26 06:06:43

在清除类属性时,mox使用setattr。因此

代码语言:javascript
复制
mock.StubOutWithMock(myinstance, 'myproperty')
myinstance.myproperty = 'goodbye'

等同于

代码语言:javascript
复制
# 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是一个属性,所以getattrsetattr将调用该属性的__get____set__方法,而不是实际“模拟”该属性本身。

因此,要获得您想要的结果,只需更深入一步,模拟实例类上的属性即可。

代码语言:javascript
复制
mock.StubOutWithMock(myinstance.__class__, 'myproperty')
myinstance.myproperty = 'goodbye'

请注意,如果您希望同时模拟具有不同myproperty值的多个MyClass实例,这可能会导致问题。

票数 9
EN

Stack Overflow用户

发布于 2010-03-25 18:18:00

你读过关于property的书吗?它是只读的,是一个"getter“。

如果你想要一个setter,你有两个选择来创建它。

一旦你同时拥有了getter和setter,你可以再次尝试模拟它们。

代码语言:javascript
复制
class MyClass(object): # Upper Case Names for Classes.
    @property
    def myproperty(self):
        return 'hello'
    @myproperty.setter
    def myproperty(self,value):
        self.someValue= value

代码语言:javascript
复制
class MyClass(object): # Upper Case Names for Classes.
    def getProperty(self):
        return 'hello'
    def setProperty(self,value):
        self.someValue= value
    myproperty= property( getProperty, setProperty )
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2512453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档