Python 如何模拟:pytest.raises未引发<;类别';子进程TimeoutExpired'&燃气轮机;

Python 如何模拟:pytest.raises未引发<;类别';子进程TimeoutExpired'&燃气轮机;,python,mocking,subprocess,pytest,try-except,Python,Mocking,Subprocess,Pytest,Try Except,我正在为任务使用子流程,我有一个try/except块用于捕获TimeoutExpired。我尝试使用副作用模拟我的对象,以便用pytest.raises捕获伪异常。无论我做什么,我得到的都没有提出。 我尝试过很多事情,尽管我对嘲弄没有太多经验,但我相信这样的事情原则上应该是可行的: # my_check.py from subprocess import TimeoutExpired, PIPE, check_output class Check: def __init__(self

我正在为任务使用
子流程
,我有一个
try/except
块用于捕获
TimeoutExpired
。我尝试使用
副作用
模拟我的对象,以便用
pytest.raises
捕获伪异常。无论我做什么,我得到的
都没有提出
。 我尝试过很多事情,尽管我对嘲弄没有太多经验,但我相信这样的事情原则上应该是可行的:

# my_check.py
from subprocess import TimeoutExpired, PIPE, check_output

class Check:
    def __init__(self, name):
        self.name = name
        self.status = self.get_status()

    def get_status(self):
        try:
            out = check_output(["ls"], universal_newlines=True, stderr=PIPE, timeout=2)
        except TimeoutExpired as e:
            print(f"Command timed out: {e}")
            raise

        if self.name in out:
            return True
        return False


# test_my_check.py
import pytest
from unittest import mock
from subprocess import TimeoutExpired

@mock.patch("src.my_check.Check", autospec=True)
def test_is_installed_exception(check_fake):
    check_fake.get_status.side_effect = TimeoutExpired
    obj_fake = check_fake("random_file.txt")
    with pytest.raises(TimeoutExpired):
        obj_fake.get_status()

但由于某些原因,它不起作用,而且我也不知道出了什么问题。

如果你想测试一个类的功能(
Check
),你不能模仿这个类。您必须模拟要更改的调用-在这种情况下,可能是
检查\u output
,您希望引发异常:

@mock.patch(“src.my\u check.check\u输出”)
def测试已安装异常(模拟检查输出):
mocked_check_output.side_effect=TimeoutExpired(“check_output”,1)
使用pytest.raises(TimeoutExpired):
选中(“random_file.txt”)
请注意:

  • 您必须修补“src.my_check.check_output”,因为您使用子流程import check_output中的
    导入
    check_output
    ,所以您在类中使用引用
  • 您必须构造一个有效的
    TimeoutExpired
    对象-它需要两个参数,因此您必须提供它们
  • 由于已在
    \uuuu init\uuuuu
    中调用了
    get\u status
    ,因此必须测试类构造-由于引发的异常,无法获得正确构造的实例