如何使用mox模拟类属性?

Har*_*mbe 5 python properties mocking mox

我有一节课:

class MyClass(object):
    @property
    def myproperty(self):
        return 'hello'
Run Code Online (Sandbox Code Playgroud)

使用moxpy.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.

bro*_*hie 9

当删除类属性时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的多个实例,则可能会出现问题.