Python模拟异常没被捕获

时间:2015-09-09 11:08:12

标签: python unit-testing mocking

在标题中挣扎着简洁地描述这一点......

我有一个我想测试的模块:

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,但我不知道如何解决这个问题。有什么建议吗?谢谢你的时间。

1 个答案:

答案 0 :(得分:2)

我最终解决了这个问题......

问题是我在嘲笑整个子进程模块,其中包含CalledProcessError异常!这就是为什么它似乎与我在我的测试模块中提出的异常相匹配,因为它是一个完全不同的对象。

修复只是模拟subprocess.check_output,D'哦!