我写了一个继承多处理过程()类。在初始化过程中,我设置了一些参数,其中一个是另一个类,它会写入硬盘上的某个文件。为了进行单元测试,我想模拟这个类实例,以避免实际写入某些文件。以下是一些最小的例子:import mock
import time
import multiprocessing as mp
import numpy as np
class MyProcess(mp.Process):
def __init__(self):
super(MyProcess, self).__init__()
# the original code would create some instance of a file manipulation
# class here:
self._some_class = np.zeros(100)
def run(self):
# the following line would actually write to some file in the original
# code:
self._some_class.sum()
for ii in range(10):
print(str(ii))
time.sleep(.01)
if __name__ == '__main__':
proc = MyProcess()
# proc._some_class = mock.Mock()
proc.start()
proc.join()
上面的代码应该按原样运行。但是,如果我试图模拟类在类MyProcess中的某个类(取消对main函数中的行的注释),我会得到错误。有趣的是,如果我试图用一个函数初始化self.\u some\u class(例如,将上面代码中的第13行替换为*self.\u some_class=lambda x:x/2*)。因此,我的猜测是,当一个新进程产生时,复制MyProcess中的对象有一些问题。这就提出了两个问题:有人能解释一下为什么不能用函数初始化类对象吗?在
如何模拟MyProcess的类对象之一?在
我真的很感激你的帮助。。。在
编辑1(有关错误消息的详细信息):
如果我取消了main函数中的行的注释,就会得到一堆错误,我认为下面应该是相关的错误:
在pickle.pickling错误:无法pickle:它与模仿。模仿在
编辑2(找到一些相关信息):
我在google代码中发现了以下issue,这似乎与我的问题有关。实际上,将main函数中的mock更改为以下内容可使代码可执行:
^{pr2}$
但是,我对测试感兴趣的是以下调用:proc.\u some_class.some\u方法尽管事实一直被称为错误的方法。我想这和我上面提到的解决方法有关。在
编辑3(基于jb建议的解决方法):
可以通过直接调用run方法来解决这个问题。以下代码包含main函数,并演示如何使用模拟测试函数:if __name__ == '__main__':
proc = MyProcess()
proc._some_class = mock.MagicMock()
proc.run()
print(proc._some_class.sum.called)