Har*_*mbe 5 python properties mocking mox
我有一节课:
class MyClass(object):
@property
def myproperty(self):
return 'hello'
Run Code Online (Sandbox Code Playgroud)
使用mox和py.test,我如何模拟myproperty?
我试过了:
mock.StubOutWithMock(myclass, 'myproperty')
myclass.myproperty = 'goodbye'
Run Code Online (Sandbox Code Playgroud)
和
mock.StubOutWithMock(myclass, 'myproperty')
myclass.myproperty.AndReturns('goodbye')
Run Code Online (Sandbox Code Playgroud)
但都失败了AttributeError: can't set attribute.
当删除类属性时mox使用setattr.从而
mock.StubOutWithMock(myinstance, 'myproperty')
myinstance.myproperty = 'goodbye'
Run Code Online (Sandbox Code Playgroud)
相当于
# 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)
Run Code Online (Sandbox Code Playgroud)
请注意,因为它myproperty是一个属性getattr,setattr将调用属性__get__和__set__方法,而不是实际"嘲笑"属性本身.
因此,为了获得您想要的结果,您只需更深入一步并在实例的类上嘲笑该属性.
mock.StubOutWithMock(myinstance.__class__, 'myproperty')
myinstance.myproperty = 'goodbye'
Run Code Online (Sandbox Code Playgroud)
请注意,如果您希望同时使用不同的myproperty值模拟MyClass的多个实例,则可能会出现问题.
| 归档时间: |
|
| 查看次数: |
5719 次 |
| 最近记录: |