Я написал функцию, которая в основном скрывает сложность использования библиотеки pySnmp для отправки сообщения SNMP, и она выглядит следующим образом:
snmpWalk(host,oid):
from pysnmp.entity.rfc3413.oneliner import cmdgen
cg = cmdgen.CommandGenerator()
comm_data = cmdgen.CommunityData('my-manager','public')
transport = cmdgen.UdpTransportTarget((host,161))
variables = oid
return cg.nextCmd(comm_data,transport,variables)
Я новичок в модульном тестировании, и я пытался написать модульный тест для этого кода в качестве doctest с использованием minimock, и вот что я придумал:
#Setup the mocks
>>> from minimock import mock, Mock
>>> cmdgen.CommandGenerator = Mock('cmdgen.CommandGenerator')
>>> cmdgen.CommunityData = Mock('cmdgen.CommunityData')
>>> cmdgen.UdpTransportTarget = Mock('cmdgen.UdpTransportTarget')
>>> cgMock = Mock('cgMock')
>>> cmdgen.CommandGenerator.mock_returns = cgMock
>>> cmdgen.CommunityData.mock_returns = 1
>>> cmdgen.UdpTransportTarget.mock_returns = 2
>>> cgMock.nextCmd.mock_returns = (1,2,3,4)
#run the test
>>> PrinterMonitor.SnmpWalk('192.0.0.1','1.1.1.1.1.1.1')
Called cmdgen.CommandGenerator()
Called cmdgen.CommunityData('my-manager', 'public')
Called cmdgen.UdpTransportTarget(('192.0.0.1', 161))
Called cgMock.nextCmd(1, 2, (1, 1, 1, 1, 1, 1, 1))
(1, 2, 3, 4)
Итак, я запускаю этот тест, и он работает нормально, но мой вопрос: действительно ли мне нужно приложить все усилия, чтобы высмеивать каждый аспект сторонней библиотеки ? По моему мнению, минимум, который мне нужно было бы смоделировать, это последняя строка cg.nextCmd(comm_data,transport,variables)
, потому что я на самом деле не хочу запускать сообщения для принтеров в своих модульных тестах, но другие вызовы кода библиотеки должны дать мне согласованные результаты в зависимости от того, что я передаю им. Я могу убедиться, что мой код соответствующим образом взаимодействует с библиотекой (т.е. убедитесь, что он правильно передает аргумент хоста в транспортную переменную, утверждая это на объекте, передаваемом поддельному cg.nextCmd(...)
вызову?