努力在标题中简洁地描述这一点......
我有一个要测试的模块:
mod.py:
import subprocess
class MyStuff(object):
def my_fun(self):
try:
print subprocess
out = subprocess.check_output(["echo", "pirates"])
except subprocess.CalledProcessError:
print "caught exception"
以及测试模块test_mod.py:
import unittest
import mock
from mod import MyStuff
import subprocess
class Tests(unittest.TestCase):
def setUp(self):
self.patched_subprocess = mock.patch(
'mod.subprocess', autospec=True)
self.mock_subprocess = self.patched_subprocess.start()
self.my_stuff = MyStuff()
def tearDown(self):
self.patched_subprocess.stop()
def test_my_fun(self):
self.mock_subprocess.check_output = mock.Mock(
side_effect=subprocess.CalledProcessError(0, "hi", "no"))
with self.assertRaises(subprocess.CalledProcessError):
out = self.my_stuff.my_fun()
if __name__ == '__main__':
unittest.main()
然后我运行 python test_mod.py
并看到以下输出:
<NonCallableMagicMock name='subprocess' spec='module' id='140654009377872'>
.
----------------------------------------------------------------------
Ran 1 test in 0.007s
OK
我很高兴子流程对象已被模拟,但为什么print“caught exception”
语句没有执行?我猜这是因为真正的异常是在 test_mod.subprocess.CalledProcessException
中抛出的,而不是在 subprocess.CalledProcessException
中抛出的,但我不知道如何解决这个问题。有什么建议吗?感谢您抽出时间。
最佳答案
我最终解决了这个问题......
问题是我正在 mock 整个子流程模块,其中包括CalledProcessError
异常!这就是为什么它似乎与我在测试模块中引发的异常不匹配,因为它是一个完全不同的对象。
修复方法是仅模拟 subprocess.check_output
,哦!
关于Python模拟异常没有被捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32477928/