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

moj*_*jo2 18 python mocking

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

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()
Run Code Online (Sandbox Code Playgroud)

就我而言,该类的实例b = B()实际上不在主函数中,而是在另一个模块中,因此我无法模拟该实例。我需要它一般作为 B 的所有实例的装饰器。

总结:我不确定如何单独模拟类方法,但仍然调用原始方法。之后,我想使用call_args_list 之类的东西,在那里我可以看到对foo().

pro*_*ico 5

我认为您正在寻找wrapsMock 参数。在官方文档中搜索wraps. 访问属性返回一个模拟对象。如果没有为模拟配置返回值,则调用方法会给出真实的方法结果。

  • 带有示例的代码片段不会有什么坏处。/sf/answers/2570724971/ (14认同)
  • 这完全按照我想要的方式工作,例如`mock.patch('os.remove',wraps=os.remove)`。这样,我就可以使用模拟来调用 `assert_used_once_with()` 等,并且 `os.remove()` 仍然会按原样被调用。 (4认同)