python - 可以用mock_open来模拟串口连接吗?

标签 python python-3.x python-unittest pyserial

大家早上好,

我正在尝试在 Python 中进行一些单元测试来确认我的代码是否正常工作,但是我很难获得 Mock 任何东西来适合我的测试用例。我是 Python 单元测试的新手,所以到目前为止这是艰难的一周。

该程序的摘要是我正在尝试对我拿到的商业显示器进行串行控制,我想我可以利用它作为最终使用 Python 做某事的机会,而不是仅仅依赖于一个我所知道的其他语言。我已经开始使用 pyserial,但在开始向电视发送大量命令之前,我想学习单元测试部分,以便我可以编写预期的输出和输入。

我尝试使用名为 dummyserial 的库,但它似乎无法识别我发送的输出。我想我应该尝试一下mock_open,因为我发现它也像标准IO一样工作,但它也没有接听电话。涉及的代码示例:

def testSendCmd(self):
    powerCheck = '{0}{1:>4}\r'.format(SharpCodes['POWER'], SharpCodes['CHECK']).encode('utf-8')
    read_text = 'Stuff\r'
    mo = mock_open(read_data=read_text)
    mo.in_waiting = len(read_text)
    with patch('__main__.open', mo):
        with open('./serial', 'a+b') as com:
            tv = SharpTV(com=com, TVID=999, tvInput = 'DVI')
            tv.sendCmd(SharpCodes['POWER'], SharpCodes['CHECK'])
            com.write(b'some junk')
    print(mo.mock_calls)
    mo().write.assert_called_with('{0}{1:>4}\r'.format(SharpCodes['POWER'], SharpCodes['CHECK']).encode('utf-8'))

在 SharpTV 类中,有问题的函数:

def sendCmd(self, type, msg):
    sent = self.com.write('{0}{1:>4}\r'.format(type,msg).encode('utf-8'))
    print('{0}{1:>4}\r'.format(type,msg).encode('utf-8'))

显然,我正在尝试控制夏普电视。我知道命令是正确的,这不是问题。问题只是测试。根据mock_open页面上的文档,调用mo.mock_calls应该返回一些调用的数据,但我只得到一组空的[],尽管这是明显错误的com.write(b'some junk')mo().write.assert_used_with(...) 返回断言错误,因为它没有检测到从 sendCmd 中写入。真正困扰我的是我可以在交互模式下执行 mock_open 部分的示例,并且它按预期工作。

我错过了一些东西,我只是不知道是什么。我希望获得帮助,让 dummyserial 正常工作,或者mock_open。

最佳答案

为了回答我的问题的一部分,我弄清楚了 dummyserial 的功能。现在可以进行以下操作:

def testSendCmd(self):
    powerCheck = '{0}{1:>4}\r'.format(SharpCodes['POWER'], SharpCodes['CHECK'])
    com = dummyserial.Serial(
            port='COM1',
            baudrate=9600,
            ds_responses={powerCheck : powerCheck}
            )
    tv = SharpTV(com=com, TVID=999, tvInput = 'DVI')
    tv.sendCmd(SharpCodes['POWER'], SharpCodes['CHECK'])
    self.assertEqual(tv.recv(), powerCheck)

之前我将字典值编码为 utf-8。 dummyserial 库会对您写入(...) 的任何内容进行解码,因此它是直接字符串与字符串比较。它还会将您正在读取的任何内容在返回时编码为 latin1。

关于python - 可以用mock_open来模拟串口连接吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53327415/

相关文章:

python - 将数据与另一个数据框中两列中的数据进行比较以填充第一个数据框中的第三列

Python: h5py 给出 OSError: Can't read data (inflate() failed) 即使它之前打开过

Python3 单元测试 : How to compare with MagicMocks Using Operators

python - 重用Mock创建属性模拟unittest.patch

python - 在 __next__() 中修改对象之前返回对象

python - 如何使用 pythonic 方式(单行)将字符串拆分为多个模式?

python - 如何在 python 中不使用 find() 的情况下查找字符串中的索引

python - 以编程方式检测是否正在测试 python 代码

python - Python 3.2 中的冒泡排序

python - 连接 panda 的选定列,同时忽略列中的空白