【发布时间】:2020-10-02 02:39:44
【问题描述】:
我正在使用subprocess 执行任务,并且我有一个try/except 块用于捕获TimeoutExpired。我尝试使用side_effect 模拟我的对象,这样我就可以使用pytest.raises 捕获虚假异常。无论我做什么,我都会得到DID NOT RAISE <class 'subprocess.TimeoutExpired'>。
我尝试了很多事情,尽管我对嘲讽的经验并不丰富,但我相信这样的事情原则上应该可行:
# 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()
由于某种原因,它不起作用,而且我无法弄清楚出了什么问题。
【问题讨论】:
标签: python mocking subprocess pytest try-except