我有一个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 …