Python Patch/Mock类方法,但仍调用原始方法

12 浏览
0 Comments

Python Patch/Mock类方法,但仍调用原始方法

我想使用patch来记录在一个类的函数中调用的所有函数调用,以便进行单元测试,但仍然需要原始函数按预期运行。我在下面创建了一个虚拟代码示例:

from mock import patch
class A(object):
    def __init__(self):
        self._a = 1
class B(A):
    def __init__(self):
        super(B, self).__init__() # TypeError: super() argument 1 must be type, not MagicMock
        self._b = 11
    def bar(self, b):
        self._b = self._b + 1 + b
    def foo(self, b):
        self.bar(b)
class MockB(B):
    def foo(self, b):
        super(MockB, self).foo(self, b)
@patch('main.B')
def main(b_class):
    b_class.side_effect = MockB
    b = B()
    print b._b # 11
    b.foo(0)
    print b._b # 12
main()

在我的情况下,类的实例b = B()实际上不在main函数中,而是在另一个模块中,所以我不能Mock实例。我需要它能够通用地作为B类的所有实例的装饰器。我不确定如何单独模拟类方法本身,但仍然调用原始方法。之后,我想使用类似call_args_list的东西,可以看到对foo()的所有调用。

0