You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:48:10