我需要像这样将类包装成模拟:
原始代码:
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
引用。什么都没有。
答案 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