后一个mock.patch()不起作用

时间:2016-05-23 09:22:49

标签: python mocking

请参阅以下代码

模拟测试/ ymath.py

def add(x, y):
    return x + y

模拟测试/ calc.py

from ymath import add

def calc(x, y):
    return add(x, y)

模拟测试/ main.py

import mock


class YAdd:
    def __init__(self, a):
        print 'YAdd init with a %s' % (a, )
        self.a = a

    def __call__(self, x, y, **kwargs):
        return x + y + self.a


def calc(x, y):
    print 'calc called...'

    @mock.patch('ymath.add', YAdd(x))
    def inner():
        from calc import calc
        print calc(x, y)
    inner()


calc(8, 3)  # Expected: 8 + 8 + 3 = 19
calc(4, 5)  # Expected: 4 + 4 + 5 = 13

结果如下所示,第二次调用的期望值为13

calc called...

YAdd init with a 8

19

calc called...

YAdd init with a 4

17

1 个答案:

答案 0 :(得分:3)

你在错误的地方打补丁。您应该修补calc.add,而不是ymath.add。请参阅where to patch上的文档。

另请注意,没有理由仅使用补丁装饰器来定义内部函数:您可以将其用作上下文管理器。

def calc(x, y):
    print 'calc called...'

    with mock.patch('calc.add', YAdd(x)):
        from calc import calc
        print calc(x, y)