5

私はクラスを持っています:

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ます。

4

2 に答える 2

9

クラス属性をスタブ化するときmoxは、setattr. したがって

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

と同等です

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

mypropertybecauseはプロパティgetattrであり、実際にプロパティ自体を「モックアウト」するのではなく、プロパティのメソッドとメソッドsetattrを呼び出すことに注意してください。__get____set__

したがって、目的の結果を得るには、さらに一歩進んで、インスタンスのクラスのプロパティをモックアウトします。

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

mypropertyMyClass の複数のインスタンスを異なる値で同時にモックしたい場合、これは問題を引き起こす可能性があることに注意してください。

于 2010-03-25T22:06:42.697 に答える
3

プロパティについて読んだことがありますか?読み取り専用の「ゲッター」です。

セッターが必要な場合、その作成方法には 2 つの選択肢があります。

ゲッターとセッターの両方を取得したら、両方のモックアウトを再試行できます。

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

または

class MyClass(object): # Upper Case Names for Classes.
    def getProperty(self):
        return 'hello'
    def setProperty(self,value):
        self.someValue= value
    myproperty= property( getProperty, setProperty )
于 2010-03-25T10:17:59.620 に答える