每次实例化该类时,如何模拟Python类以返回唯一的autospec Mock实例?

nyanpasu64

我正在写一个创建subprocess.Popen管道的程序我正在尝试模拟subprocess.Popen,以便每个调用都返回一个不同的字符串,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
nyanpasu64

由于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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

@Mock 对象实例为空

如何定义一个方法,以便返回当前类的实例,而不是返回在Python中继承该类的实例的实例?

@Mock注释后,模拟实例为null

如何注释类方法返回该类的实例

xUnit Mock 从 IoC 容器请求新实例

测试时,Mock 还是实例化新对象更好?

jQuery:当它不是div的唯一类时,定位该类的第n个实例

如何为junit测试实例化Mock Kafka主题?

每次实例化类时如何实例化单独的bean成员

为什么@Mock的Mockito创建非模拟实例?

创建唯一的实例是可行的,但是当再次调用该类时如何获得引用?

每次调用类实例时如何增加

包装一个类,其方法返回该类的实例

如何模拟返回类实例的属性变量

来自初始化程序的RSpec double / mock实例变量

如何对实例化的模拟类对象断言

如何通过动态接收类名称来实例化该类

如何将返回类型注释为类实例或其(唯一)子类实例?

Google Mock:模拟私有变量成员,该成员在目标类的构造函数中实例化

使用Mock进行Nunit测试。接口实例

用Moq在现有实例周围创建Mock?

ScalaMock,在测试之间共享模拟实例时发生意外调用:<mock-1>

如何从 Python 中的该类中创建嵌套类的实例?

出现在两个列表中时如何比较一个类的两个列表并返回该类的实例

检查python类的实例是否具有属性而不实例化该类

如何删除该类中某个类的实例?

如何实例化从函数返回的类?

如何模拟类实例属性?

模拟如何断言类实例