![](/img/trans.png)
[英]AttributeError for exception subprocess.TimeoutExpired
[英]How to Mock: pytest.raises DID NOT RAISE <class 'subprocess.TimeoutExpired'>
我正在使用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()
出于某种原因,它不起作用,我无法理解出了什么问题。
如果要测试类 ( Check
) 的功能,则不能模拟该类。 您必须模拟要更改的调用 - 在这种情况下可能是check_output
,您希望引发异常:
@mock.patch("src.my_check.check_output")
def test_is_installed_exception(mocked_check_output):
mocked_check_output.side_effect = TimeoutExpired("check_output", 1)
with pytest.raises(TimeoutExpired):
Check("random_file.txt")
一些注意事项:
from subprocess import check_output
import check_output
from subprocess import check_output
,所以你在你的类中使用引用TimeoutExpired
对象 - 它需要 2 个参数,因此您必须提供它们get_status
已经在__init__
调用,因此您必须测试类构造 - 由于引发的异常,您无法获得正确构造的实例
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.