作者VivianAnn (薇薇安安)
看板Python
标题[问题]如何使用unittest.mock测试subprocess.run
时间Fri Aug 26 14:41:19 2022
各位版友好
本人目前想用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://webptt.com/cn.aspx?n=bbs/Python/M.1661496081.A.0F8.html
※ 编辑: VivianAnn (168.127.214.224 美国), 08/26/2022 14:42:59
1F:推 lycantrope: 应该直接对mock_rc.stderr设定成 "stderr message"? 08/27 12:42
2F:→ lycantrope: stderr非method若设return_value会被当成method mock 08/27 12:43