我正在用于subprocess一項任務,并且我有一個try/except用于捕獲的塊TimeoutExpired。我嘗試使用來模擬我的對象,side_effect這樣我就可以使用 來捕獲假異常pytest.raises。無論我做什么,我都會得到DID NOT RAISE <class 'subprocess.TimeoutExpired'>。我嘗試過很多事情,盡管我對嘲笑沒有那么豐富的經驗,但我相信類似的事情原則上應該有效:# my_check.pyfrom subprocess import TimeoutExpired, PIPE, check_outputclass 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.pyimport pytestfrom unittest import mockfrom subprocess import [email protected]("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()由于某種原因它不起作用,但我無法理解出了什么問題。
1 回答

元芳怎么了
TA貢獻1798條經驗 獲得超7個贊
如果你想測試一個類()的功能,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")
一些注意事項:
你必須修補“src.my_check.check_output”,因為你導入
check_output
使用from subprocess import check_output
,所以你使用類中的引用你必須構造一個有效的
TimeoutExpired
對象 - 它需要 2 個參數,所以你必須提供它們正如
get_status
已經調用的那樣__init__
,您必須測試類構造 - 由于引發的異常,您無法獲得正確構造的實例
添加回答
舉報
0/150
提交
取消