我有一个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
要对current_ma
方法进行单元测试,我必须模拟smbus访问。我的第一个想法是修补read_i2c_block_data
方法:
mock.patch('power_sensor.smbus.SMBus.read_i2c_block_data')
但如果我在执行测试时这样做,我得到了:
TypeError: can't set attributes of built-in/extension type 'smbus.SMBus'
我很确定,这是因为smbus
是用C编写的模块。所以它不可修补。我阅读的解决方案是继承SMBus
类。但这意味着我必须在我的PowerSensor
类中使用这些子类,不是吗?这听起来不太方便。有没有更好的方法来解决这个问题?
谢谢&amp;此致