在Python 3中没有为信号处理程序调用MagicMock

问题描述

我正在将一些代码和相关测试从python 2迁移到python 3(特别是2.7到3.7),并且遇到了这种奇怪的行为,我想了解:

try:
    from unittest import mock  # python 3
except ImportError:
    import mock  # python 2
import os
import signal


def do_signal(mock_type):
    def side_effect(signum,frame):
        print('Called for ' + mock_type.__name__)
    handler = mock_type(side_effect=side_effect)
    signal.signal(signal.SIGTERM,handler)
    os.kill(os.getpid(),signal.SIGTERM)
    print(handler.call_count)


do_signal(mock.Mock)
do_signal(mock.MagicMock)

在这里,我使用mock.Mockmock.MagicMock作为信号处理程序,并且在将信号发送到当前进程后,打印出模拟被调用的次数。

在python 2.7中,它打印出来:

Called for Mock
1
Called for MagicMock
1

但是对于python3.7,它会打印出来:

Called for Mock
1
0

对于python 3,MagicMock似乎根本没有被调用。颠倒do_signal调用的顺序不会改变这一点。

MockMagicMock之间的行为差​​异可以解释这一点,为什么行为从python 2变为3?我知道mock是作为unittest.mock添加到python 3的标准库中的,所以我很好奇这里是否有所改变。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)