子进程中生成的补丁对象
patch object spawned in sub-processs
我正在使用 multiprocessing
包来创建子流程。我需要处理子流程的异常。捕获、报告、终止和重新生成子进程。
我很难为它创建测试。
我想修补代表我的子流程的对象并引发异常以查看处理是否正确。
但看起来该对象仅在主进程中进行了修补,而在派生进程中是未更改的版本。对如何完成请求的功能有任何想法吗?
示例:
import multiprocessing
import time
class SubprocessClass(multiprocessing.Process):
def __init__(self) -> None:
super().__init__()
def simple_method(self):
return 42
def run(self):
try:
self.simple_method()
except Exception:
# ok, exception handled
pass
else:
# I wanted exception ! <- code goes here
assert False
@mock.patch.object(SubprocessClass, "simple_method")
def test_patch_subprocess(mock_simple_method):
mock_simple_method.side_effect = Exception("exception from mock")
subprocess = SubprocessClass()
subprocess.run()
subprocess.start()
time.sleep(0.1)
subprocess.join()
您可以在对象启动之前对其进行猴子修补
(这有点不确定,但你会得到实际过程 运行 该代码)
def _this_always_raises(*args, **kwargs):
raise RuntimeError("I am overridden")
def test_patch_subprocess():
subprocess = SubprocessClass()
subprocess.simple_method = _this_always_raises
subprocess.start()
time.sleep(0.1)
subprocess.join()
assert subprocess.exitcode == 0
您也可以模拟多处理使其表现得像线程,但这有点不可预测
如果你想对所有对象进行通用操作,你可以模拟 class 另一个从原始对象派生的对象,只覆盖一个方法
class SubprocessClassThatRaisesInSimpleMethod(SubprocessClass):
def simple_method(self):
raise RuntimeError("I am overridden")
# then mock with unittest mock the process spawner to use this class instead of SubprocessClass
我正在使用 multiprocessing
包来创建子流程。我需要处理子流程的异常。捕获、报告、终止和重新生成子进程。
我很难为它创建测试。
我想修补代表我的子流程的对象并引发异常以查看处理是否正确。 但看起来该对象仅在主进程中进行了修补,而在派生进程中是未更改的版本。对如何完成请求的功能有任何想法吗?
示例:
import multiprocessing
import time
class SubprocessClass(multiprocessing.Process):
def __init__(self) -> None:
super().__init__()
def simple_method(self):
return 42
def run(self):
try:
self.simple_method()
except Exception:
# ok, exception handled
pass
else:
# I wanted exception ! <- code goes here
assert False
@mock.patch.object(SubprocessClass, "simple_method")
def test_patch_subprocess(mock_simple_method):
mock_simple_method.side_effect = Exception("exception from mock")
subprocess = SubprocessClass()
subprocess.run()
subprocess.start()
time.sleep(0.1)
subprocess.join()
您可以在对象启动之前对其进行猴子修补 (这有点不确定,但你会得到实际过程 运行 该代码)
def _this_always_raises(*args, **kwargs):
raise RuntimeError("I am overridden")
def test_patch_subprocess():
subprocess = SubprocessClass()
subprocess.simple_method = _this_always_raises
subprocess.start()
time.sleep(0.1)
subprocess.join()
assert subprocess.exitcode == 0
您也可以模拟多处理使其表现得像线程,但这有点不可预测
如果你想对所有对象进行通用操作,你可以模拟 class 另一个从原始对象派生的对象,只覆盖一个方法
class SubprocessClassThatRaisesInSimpleMethod(SubprocessClass):
def simple_method(self):
raise RuntimeError("I am overridden")
# then mock with unittest mock the process spawner to use this class instead of SubprocessClass