Python-如何对i2c设备包装器类进行单元测试

use*_*527 5 python unit-testing mocking i2c

我有一个python类,用于抽象通过i2c连接的专用设备(功率传感器)。我将python-smbus模块用于I2c访问。当然,在该类中,我有current_ma使用smbus.SMBus()该类的方法(即,以毫安为单位返回当前值)。

import smbus

class PowerSensor(object):
    def __init__(self, bus, addr):
        self.__bus = smbus.SMBus(bus)
        self.__addr = addr

    def current_ma(self):
        data = self.__bus.read_i2c_block_data(self.__addr, 0x04)
        if data[0] >> 7 == 1:
            current = data[0] * 256 + data[1]
            if current & (1 << 15):
                current = current - (1 << 16)
        else:
            current = (data[0] << 8) | (data[1])
        return current / 10
Run Code Online (Sandbox Code Playgroud)

要对current_ma方法进行单元测试,我必须模拟smbus访问。我的第一个想法是修补该read_i2c_block_data方法:

mock.patch('power_sensor.smbus.SMBus.read_i2c_block_data')
Run Code Online (Sandbox Code Playgroud)

但是,如果我在执行测试时这样做,则会得到:

TypeError: can't set attributes of built-in/extension type 'smbus.SMBus'
Run Code Online (Sandbox Code Playgroud)

我很确定,这是因为smbus它是用C编写的模块。因此它不可修补。我读到的解决方案是将SMBus类子类化。但这意味着我也必须在类中使用这些子PowerSensor类,不是吗?听起来不太方便。有解决这个问题的更好方法吗?

感谢和问候