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