Python中使用Mock包patch装饰器Mock类的技术问题咨询
看起来你已经用@patch装饰器搭好了测试框架,还用上了autospec=True来保证mock的结构和原模块一致,这是个很好的习惯!下面我结合你的代码场景,给你几种常见的mock配置方案,帮你实现特定功能:
1. 让Mock类的方法返回特定值
如果想让return_something_from_my_module()返回你指定的实例或值,需要先拿到mock类的实例对象(因为some_class是被mock模块里的类),再配置方法的返回值:
def test_with_boundary_creates_job_flow_task(self, mock_mymodule): # 获取some_class的mock实例(当代码调用some_class()时会返回这个实例) mock_some_class_instance = mock_mymodule.some_class.return_value # 配置目标方法返回你期望的类实例 expected_instance = ExpectedValueClass() mock_some_class_instance.return_something_from_my_module.return_value = expected_instance # 执行你要测试的业务代码(比如调用依赖some_class的函数) returned_value = your_business_function() # 做断言验证 self.assertIsInstance(returned_value, ExpectedValueClass)
2. 让Mock方法抛出异常(测试错误场景)
如果要测试代码的错误处理逻辑,可以给mock方法设置side_effect来抛出指定异常:
def test_error_handling_for_my_module(self, mock_mymodule): mock_some_class_instance = mock_mymodule.some_class.return_value # 配置方法抛出ValueError mock_some_class_instance.return_something_from_my_module.side_effect = ValueError("Test error case") # 验证代码是否正确捕获异常 with self.assertRaises(ValueError): your_business_function_that_may_fail()
3. 配置Mock类的属性值
如果被测试代码需要访问some_class的属性,可以直接给mock实例设置属性:
def test_access_class_attributes(self, mock_mymodule): mock_some_class_instance = mock_mymodule.some_class.return_value # 设置mock实例的属性值 mock_some_class_instance.critical_config = "test_config_value" # 执行业务代码后,还可以验证属性是否被正确使用 your_business_function_that_uses_attribute() self.assertEqual(mock_some_class_instance.critical_config, "test_config_value")
4. 验证Mock方法的调用情况
除了配置行为,你还可以验证方法是否被正确调用(次数、参数等),这对测试逻辑正确性很有帮助:
def test_method_called_correctly(self, mock_mymodule): mock_some_class_instance = mock_mymodule.some_class.return_value # 执行业务代码 your_business_function() # 验证方法被调用了一次 mock_some_class_instance.return_something_from_my_module.assert_called_once() # 验证调用时传入了正确的参数 mock_some_class_instance.return_something_from_my_module.assert_called_with(expected_param_1, expected_param_2)
关于autospec=True的小提醒
因为你用了autospec=True,mock会严格模拟原模块/类的结构:
- 如果原类没有某个方法/属性,你试图配置它的话会直接报错,这能帮你提前发现测试中的错误
- 所有针对实例方法的配置,都必须通过
mock_mymodule.some_class.return_value来操作,不能直接修改mock_mymodule.some_class本身
另外注意:用@patch装饰测试类时,mock对象会作为参数传递给每个测试方法,而不是自动成为测试类的属性(除非你在setUp里手动赋值),所以不要像你原来代码里那样用self.some_class,而是用方法参数里的mock_mymodule来访问被mock的模块哦。
内容的提问来源于stack exchange,提问作者blamblam
相关产品推荐
相关产品推荐

