每次实例化 class 时,如何模拟 Python class 到 return 唯一的 autospec Mock 实例?
How to mock a Python class to return unique autospec Mock instance, every time the class is instantiated?
我正在编写一个创建 subprocess.Popen
管道的程序。我正在尝试模拟 subprocess.Popen
以便每次调用 returns 一个不同的 MagicMock
这样我就可以确保在管道中的特定(或所有)进程上调用方法。
我也希望此模拟基于 subprocess.Popen
自动指定,但不断收到错误消息,提示我无法基于模拟自动指定。
目前我的代码如下:
@pytest.fixture
def Popen(mocker: 'pytest_mock.MockFixture'):
def popen_factory(*args, **kwargs):
popen = mocker.MagicMock() # mocker.create_autospec(subprocess.Popen)
popen.stdin = open(os.devnull, "wb")
popen.stdout = open(os.devnull, "rb")
popen.wait.return_value = 0
return popen
Popen = mocker.patch.object(subprocess, 'Popen', autospec=True)
Popen.side_effect = popen_factory
yield Popen
由于 mocker.patch.object(subprocess, 'Popen', autospec=True)
覆盖了 subprocess.Popen
,我必须将现有值分配给局部变量,然后改用它。
@pytest.fixture
def Popen(mocker: 'pytest_mock.MockFixture'):
real_Popen = subprocess.Popen
def popen_factory(*args, **kwargs):
popen = mocker.create_autospec(real_Popen)
popen.stdin = open(os.devnull, "wb")
popen.stdout = open(os.devnull, "rb")
popen.wait.return_value = 0
return popen
Popen = mocker.patch.object(subprocess, 'Popen', autospec=True)
Popen.side_effect = popen_factory
yield Popen
我正在编写一个创建 subprocess.Popen
管道的程序。我正在尝试模拟 subprocess.Popen
以便每次调用 returns 一个不同的 MagicMock
这样我就可以确保在管道中的特定(或所有)进程上调用方法。
我也希望此模拟基于 subprocess.Popen
自动指定,但不断收到错误消息,提示我无法基于模拟自动指定。
目前我的代码如下:
@pytest.fixture
def Popen(mocker: 'pytest_mock.MockFixture'):
def popen_factory(*args, **kwargs):
popen = mocker.MagicMock() # mocker.create_autospec(subprocess.Popen)
popen.stdin = open(os.devnull, "wb")
popen.stdout = open(os.devnull, "rb")
popen.wait.return_value = 0
return popen
Popen = mocker.patch.object(subprocess, 'Popen', autospec=True)
Popen.side_effect = popen_factory
yield Popen
由于 mocker.patch.object(subprocess, 'Popen', autospec=True)
覆盖了 subprocess.Popen
,我必须将现有值分配给局部变量,然后改用它。
@pytest.fixture
def Popen(mocker: 'pytest_mock.MockFixture'):
real_Popen = subprocess.Popen
def popen_factory(*args, **kwargs):
popen = mocker.create_autospec(real_Popen)
popen.stdin = open(os.devnull, "wb")
popen.stdout = open(os.devnull, "rb")
popen.wait.return_value = 0
return popen
Popen = mocker.patch.object(subprocess, 'Popen', autospec=True)
Popen.side_effect = popen_factory
yield Popen