看板 Python 關於我們 聯絡資訊
各位版友好 本人目前想用Python的mock來測試subprocess.run() 看了一些網路資料,但還是試不出來 在common.py欲測試的function為check(),內容如下: import subprocess def check(): cmd = ["python3", "is_corrupted.py"] process = subprocess.run(cmd, stderr=subprocess.PIPE, check=False) if process.stderr: return "str(process.stderr)" elif process.returncode == 1: return "corrupted" return "pass" 本人在另一個檔案test.py用mock寫的測試函數為: import unittest import subprocess from unittest import mock from common import check Class UT(unittest.TestCase): @mock.patch(subprocess.run) def test_check(self, mock_subprocess_run): mock_rc = mock.MagicMock() mock_subprocess_run.return_value = mock_rc mock_rc.stderr.return_value = b'stderr message' self.assertEqual(check(), "stderr message") if __name__ == "__main__": unittest.main() 得到以下錯誤: ====================================================================== FAIL: test_check (__main__.UT) ---------------------------------------------------------------------- Traceback (most recent call last): File "/usr/lib64/python3.6/unittest/mock.py", line 1183, in patched return func(*args, **keywargs) File "test.py", line 13, in test_check self.assertEqual(check(), "stderr message") AssertionError: "<MagicMock name='run().stderr' id='140534116111528'>" != 'stderr message' - <MagicMock name='run().stderr' id='140534116111528'> + stderr message 實在不知自己錯在哪,為何在test.py中的process.stderr仍然是一個MagicMock物件而 非字串? 我已經為其設定 return_value了 先謝謝各位看完文章! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 168.127.214.224 (美國) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1661496081.A.0F8.html ※ 編輯: VivianAnn (168.127.214.224 美國), 08/26/2022 14:42:59
lycantrope: 應該直接對mock_rc.stderr設定成 "stderr message"? 08/27 12:42
lycantrope: stderr非method若設return_value會被當成method mock 08/27 12:43