可以使用模拟_打开模拟串行连接吗?

时间:2018-11-15 20:27:38

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

早上好,

我正在尝试在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”部分中完成示例,并且它按预期工作。

我想念什么,我只是不知道。我需要帮助以使虚拟程序正常工作或嘲笑打开。

1 个答案:

答案 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的内容编码。