Python模拟延迟side_effect估值

时间:2015-01-18 17:32:47

标签: python python-2.7 mocking magicmock

有没有办法推迟评估Mock side_effect。

def mockfunc(wheel):
    wheel.rubber = soft

wheel.make = Mock(side_effect=mockfunc(wheel)))

这里的问题是我试图更换'wheel.make'方法,当它在测试中被调用时,调用mockfunc并设置其中一个wheel属性而不是运行常用方法。

事情是 - 当我设置side_effect时,立即发生mockfunc调用,橡胶属性设置为soft。在调用方法wheel.make之前,我不希望这种情况发生。

1 个答案:

答案 0 :(得分:0)

根据side_effect documentation,它应该是可调用的,可迭代的或异常的(类或对象)。此外,我想您要替换make类中的未绑定方法wheel:要进行这些修补,您应该使用patch or patch.object作为描述的上下文或装饰器{{3 }}

以下是如何操作的完整示例:

from mock import patch

class Wheel():
    def __init__(self):
        self.rubber = 0

    def make(self):
        self.rubber = 10

soft = 36
def mockfunc(wheel):
    wheel.rubber = soft

wheel = Wheel()
print("unpatched wheel before make rubber = {}".format(wheel.rubber))
wheel.make()
print("unpatched wheel after make rubber = {}".format(wheel.rubber))

with patch.object(Wheel, "make", side_effect=mockfunc, autospec=True):
    print("patched wheel before make rubber = {}".format(wheel.rubber))
    wheel.make()
    print("patched wheel after make rubber = {}".format(wheel.rubber))

输出

unpatched wheel before make rubber = 0
unpatched wheel after make rubber = 10
patched wheel before make rubber = 10
patched wheel after make rubber = 36