Можете ли вы использовать mock_open для симуляции последовательных соединений? - PullRequest
0 голосов
/ 15 ноября 2018

Доброе утро,

Я пытаюсь запустить несколько юнит-тестов в Python, чтобы подтвердить, что мой код работает, но мне очень трудно заставить Mock-что вписаться в мой тестслучаев.Я новичок в модульном тестировании Python, так что до сих пор это была трудная неделя.

Вкратце о программе я пытаюсь выполнить последовательный контроль коммерческого монитора.Я подумал, что смогу использовать его как шанс наконец-то использовать Python для чего-то большего, чем просто использовать один из других известных мне языков.У меня готовится pyserial, но прежде чем я начну передавать кучу команд на телевизор, я хотел бы изучить часть unittest, чтобы я мог написать для своих ожидаемых выходов и входов.

Я пыталсяиспользуя библиотеку 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'))

Очевидно, я пытаюсь управлять телевизором Sharp.Я знаю, что команды верны, это не проблема.Вопрос только в тестировании.Согласно документации на странице mock_open, вызов mo.mock_calls должен вернуть некоторые данные, которые были сделаны вызовом, но я получаю просто пустой набор [], даже несмотря на явно неправильные com.write(b'some junk') и mo().write.assert_called_with(...) возвращается с ошибкой подтверждения, потому что не обнаруживает запись из sendCmd.Что меня действительно беспокоит, так это то, что я могу делать примеры из раздела mock_open в интерактивном режиме, и он работает как положено.

Я что-то упустил, я просто не знаю, что.Мне нужна помощь, чтобы заставить либо работать dummyserial, либо mock_open.

1 Ответ

0 голосов
/ 16 ноября 2018

Чтобы ответить на одну часть моего вопроса, я выяснил функциональность 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 декодирует все, что вы write(...), таким образом, это прямое сравнение строк и строк. Он также кодирует все, что вы read() указываете как латиница 1 на обратном пути.

...