Python模拟异常没有被捕获

标签 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 中抛出的,但我不知道如何解决这个问题。有什么建议吗?感谢您抽出时间。

最佳答案

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

问题是我正在 mock 整个子流程模块,其中包括CalledProcessError异常!这就是为什么它似乎与我在测试模块中引发的异常不匹配,因为它是一个完全不同的对象。

修复方法是仅模拟 subprocess.check_output,哦!

关于Python模拟异常没有被捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32477928/

相关文章:

python - Python 的全文搜索引擎

spring - Spring Boot 和 RestAssured 中的模拟 session

java - 如何模拟对象构造?

python - 如何从列表中定位 python 小部件标签?

python - 在 Django 应用程序中为用户的操作添加日志条目

python - 如何在 Python 中执行矢量化操作?

unit-testing - Angular 2 Jasmine 无法绑定(bind)到 'routerLink',因为它不是 'a' 的已知属性

javascript - 如何解决运行测试时代码覆盖率未找到函数的问题?

c# - 单元测试与键选择器和比较器不同

unit-testing - 在 Go 单元测试中使用两个不同的模拟