繁体   English   中英

通过 Multiprocessing.Process 调用 class 中的 Mocking 方法

[英]Mocking method in class called through Multiprocessing.Process

我正在编写一个 python tcp 代理:每当从客户端建立连接时,代理都会建立与服务器的连接,并透明地转发两个流。 此外,当被转发的数据包有一些条件时,我希望对其进行解析并将其发送到另一台服务器。

这是我的单元测试的内容:

class TestParsing(TestCase):
    def setUp(self) -> None:
        self.patcher = patch('EnergyDataClient.EnergyDataClient', autospec=True)
        self.EC_mock = self.patcher.start()
        EnergyAgent.EC = self.EC_mock()
        EnergyAgent.GP = MyParser.MyParser()
        self.server = multiprocessing.Process(target=tcp_server, args=(1235,))
        self.gp = multiprocessing.Process(target=EnergyAgentRunner, args=(1234, 1235))
        self.server.start()
        self.gp.start()

    def tearDown(self) -> None:
        self.patcher.stop()
        self.server.terminate()
        self.gp.terminate()

        while self.server.is_alive() or self.gp.is_alive():
            sleep(0.1)

    def test_parsemessage(self):
        # start the client process, and wait until done
        result = tcp_client(1234, correct_packets['DATA04']['request'])
        self.assertEqual(correct_packets['DATA04']['request'], result)
        EnergyAgent.EC.post.assert_called_once()

我想验证 object EC 上的“发布”方法是用我希望截获的内容调用的……但是,由于 object 在另一个进程上,mocking 似乎没有帮助。 我究竟做错了什么?

我弄清楚这里发生了什么。 调用 multiprocessing.Process 时,python 使用 fork() 生成一个新进程,该进程在子进程上生成 memory 页面的副本。 这就是原因,因为我可以修补 EnergyAgent.GP 并且可以工作(因为 object 仅从该点读取,我们不需要在主进程中返回)并且 EnergyAgent.EC不起作用:模拟的 object 得到成功更新了子进程,但父进程从未意识到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM