gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:34:28 27 4
gpt4 key购买 nike

大家早上好,

我正在尝试在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com