[問題]如何使用unittest.mock測試subprocess.run

看板Python作者 (薇薇安安)時間2年前 (2022/08/26 14:41), 2年前編輯推噓1(101)
留言2則, 1人參與, 2年前最新討論串1/1
各位版友好 本人目前想用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

08/27 12:42, 2年前 , 1F
應該直接對mock_rc.stderr設定成 "stderr message"?
08/27 12:42, 1F

08/27 12:43, 2年前 , 2F
stderr非method若設return_value會被當成method mock
08/27 12:43, 2F
文章代碼(AID): #1Z26iH3u (Python)
文章代碼(AID): #1Z26iH3u (Python)