如何使用 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
。
I have a class:
class MyClass(object):
@property
def myproperty(self):
return 'hello'
Using mox
and py.test
, how do I mock out myproperty
?
I've tried:
mock.StubOutWithMock(myclass, 'myproperty')
myclass.myproperty = 'goodbye'
and
mock.StubOutWithMock(myclass, 'myproperty')
myclass.myproperty.AndReturns('goodbye')
but both fail with AttributeError: can't set attribute
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
当删除类属性时,
mox
使用setattr
。因此相当于
注意,因为
myproperty
是一个属性getattr
并且setattr
将调用该属性的__get__
和 < code>__set__ 方法,而不是实际“模拟”属性本身。因此,为了获得您想要的结果,您只需更深入地模拟实例类上的属性即可。
请注意,如果您希望同时模拟具有不同
myproperty
值的 MyClass 的多个实例,这可能会导致问题。When stubbing out class attributes
mox
usessetattr
. Thusis equivalent to
Note that because
myproperty
is a propertygetattr
andsetattr
will be invoking the property's__get__
and__set__
methods, rather than actually "mocking out" the property itself.Thus to get your desired outcome you just go one step deeper and mock out the property on the instance's class.
Note that this might cause issues if you wish to concurrently mock multiple instances of MyClass with different
myproperty
values.您读过属性吗?它是只读的,是一个“getter”。
如果您想要一个 setter,您有两种创建方式的选择。
一旦你拥有 getter 和 setter,你就可以再次尝试模拟它们。
或者
Have you read about property? It's read-only, a "getter".
If you want a setter, you have two choices of how to create that.
Once you have both getter and setter, you can try again to mock out both of them.
Or