如何模拟Python类以仅更改一个参数

时间:2019-06-05 04:02:01

标签: python mocking python-mock

我需要像这样将类包装成模拟:

原始代码:

class _InnerImpl(object):

  def __init__(self, arg1, arg2, arg3):
    # do stuff

我想做这样的事情:

from unittest.mock import patch

def my_wrapper(*args, **kwargs):
  kwargs['arg1'] = gen_next_value()  # change one of the arguments
  return _InnerImpl(*args, **kwargs)  # call the real thing with modified args

def run(user_input):
  with patch(_InnerImpl, my_wrapper):
     some_method(user_input)

不幸的是,patch的工作方式不能称为“真实的东西”,因为它也在with patch块内被调用。这样会导致无限递归循环。

我在单元测试之外的实现中使用它。因此,这不适用于单元测试。我已经尝试过各种方法,例如使用__init__保存wraps引用。什么都没有。

1 个答案:

答案 0 :(得分:0)

我建议不要对不是单元测试的东西使用模拟。如果我理解您的示例,则似乎您需要的是Factory方法模式https://en.wikipedia.org/wiki/Factory_method_pattern

如果无法修改要修补的代码,请尝试使用其他名称空间。例如给定的目标代码GroundOverlay

a.py

您可以写class A(object): def __init__(self, v): print('A({})'.format(v)) def foo(): y = A('a')

b.py