如何在Python unittest中Mock设备对象的connected属性?
解决方案
要Mock只读的connected属性,你可以用unittest.mock.patch.object临时替换该属性的值,以此模拟设备未连接的异常场景。具体实现如下:
首先确保测试文件中导入了NotConnected异常类,然后修改测试用例:
import unittest from unittest.mock import patch from your_module import Device, NotConnected # 替换成你的实际模块名 class TestDevice(unittest.TestCase): def setUp(self): self.PORT = "A PORT" self.DEVICE = Device(self.PORT) def test_get_description(self): description = self.DEVICE.get_description() self.assertIsInstance(description, str) def test_get_description_not_connected(self): # 用patch.object临时将connected属性设为False with patch.object(self.DEVICE.device, 'connected', return_value=False): # 断言调用get_description时会抛出NotConnected异常 with self.assertRaises(NotConnected) as context: self.DEVICE.get_description() # 可选:验证异常信息是否符合预期 self.assertEqual(str(context.exception), "Device is not Connected")
原理说明
patch.object可以针对特定对象的属性进行Mock,即便该属性是只读的,它会在with代码块生效期间临时替换属性的返回值。- 上下文管理器退出后,
connected属性会自动恢复原本的真实值,不会干扰其他测试用例的执行。
如果你想完全隔离真实设备,也可以直接MockDevice类的device属性:
import unittest from unittest.mock import patch, Mock from your_module import Device, NotConnected class TestDevice(unittest.TestCase): def setUp(self): self.PORT = "A PORT" def test_get_description(self): with patch.object(Device, 'device') as mock_device: mock_device.connected = True mock_device.Description = "Test Device" device = Device(self.PORT) description = device.get_description() self.assertIsInstance(description, str) self.assertEqual(description, "Test Device") @patch.object(Device, 'device') def test_get_description_not_connected(self, mock_device): # 配置Mock对象的属性 mock_device.connected = False device = Device(self.PORT) with self.assertRaises(NotConnected): device.get_description()
这种方式会让Device实例初始化时使用Mock的device对象,完全脱离真实设备的依赖,适合纯单元测试场景。
内容的提问来源于stack exchange,提问作者niaei
相关产品推荐
相关产品推荐

