我编写了一个函数,它基本上隐藏了使用 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)
我是单元测试的新手,我试图为此代码编写一个单元测试作为使用 minimock 的 doctest,这就是我想出的:
#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)
所以我运行了这个测试,结果很好,但我的问题是,我真的需要付出所有这些努力来模拟 3rd 方库的各个方面吗?在我看来,我需要模拟的最低限度是最后一行cg.nextCmd(comm_data,transport,variables)
,因为我实际上并不想在我的单元测试中开始向打印机发送消息,但是对库代码的其他调用应该会给我一致的结果,具体取决于什么我传给他们。我可以确保我的代码与库进行适当的交互(即,通过在传递给模拟cg.nextCmd(...)
调用的对象上断言 this 来确保它正确地将主机参数传递给传输变量?