Python - HowTo unittest i2c设备包装类

时间:2016-12-21 14:30:24

标签: 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

要对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;此致

0 个答案:

没有答案