早上好,
我正在尝试在Python中进行一些单元测试,以确认我的代码是否正常运行,但是要获得适合于我的测试用例的Mock东西却很难。我是Python单元测试的新手,所以到目前为止,这是一个艰难的星期。
该程序的摘要是我正在尝试对自己接触的商用显示器进行串行控制,我认为我将以此为契机最终将Python用于某些用途,而不是仅仅依靠它。我知道的其他语言。我有pyserial,但是在我开始将大量命令推向电视之前,我想学习unittest部分,以便我可以为期望的输出和输入编写内容。
我尝试使用一个名为dummyserial的库,但是它似乎无法识别我正在发送的输出。我以为我可以尝试一下ock_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'))
很显然,我正在尝试控制Sharp TV。我知道命令是正确的,这不是问题。问题只是测试。根据模拟_打开页面上的文档,调用mo.mock_calls
应该返回已进行调用的一些数据,但是即使公然错误的com.write(b'some junk')
,我也只能得到一组空的[]。 ,并且mo().write.assert_called_with(...)
返回一个断言错误,因为它未从sendCmd中检测到写入。真正困扰我的是,我可以在交互模式下从“ mock_open”部分中完成示例,并且它按预期工作。
我想念什么,我只是不知道。我需要帮助以使虚拟程序正常工作或嘲笑打开。
答案 0 :(得分:0)
要回答我的问题的一部分,我弄清楚了虚拟串口的功能。现在可以进行以下操作:
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
。伪序列库会将您write(...)
所解码的内容解码为纯字符串与字符串比较。它还将在退回途中将read()
编码为latin1的内容编码。