如何Mock外部类B的构造函数抛出异常以测试类A的异常捕获
问题解决:正确Mock外部类构造函数抛出异常的测试
你的问题核心是patch的目标路径错了,不是external_module_b.B,而是module_a.B。
为什么原来的写法不生效?
当module_a执行from external_module_b import B时,会在自己的命名空间里创建一个指向B的引用。你之前patch的是原模块external_module_b里的B,但module_a已经缓存了导入的引用,所以类A的__init__还是用的原来的B,mock根本没替换到实际被调用的对象。
修正后的测试代码
写法一:在方法内设置side_effect
# test_module_a.py from unittest import mock, TestCase from module_a import A class MyTestCase(TestCase): @mock.patch("module_a.B") def test_constructor_throws(self, mock_b: mock.Mock): mock_b.side_effect = Exception("test") a = A() self.assertFalse(a.ok) # 可选:验证B确实被调用了一次 self.assertEqual(mock_b.call_count, 1)
写法二:直接在patch装饰器中指定side_effect
@mock.patch("module_a.B", side_effect=Exception("Test")) def test_constructor_throws(self, mock_b: mock.Mock): a = A() self.assertFalse(a.ok) self.assertEqual(mock_b.call_count, 1)
验证结果
运行测试后,a.ok会被正确设置为False——现在mock替换的是module_a中实际被使用的B引用,当实例化B时抛出异常,会被A的try-except块捕获,执行self.ok = False的逻辑。
内容的提问来源于stack exchange,提问作者Andrew Cheong
相关产品推荐
相关产品推荐

