基本的に、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)
だから私はこのテストを実行し、それはうまくいきますが、私の質問は、サードパーティのライブラリのあらゆる側面をモックするために本当にこのすべての努力をする必要があるのですか? cg.nextCmd(comm_data,transport,variables)
私の考えでは、単体テストでプリンターへのメッセージの送信を実際に開始したくないため、モックする必要がある最小限は最終行ですが、ライブラリコードへの他の呼び出しでは、何に応じて一貫した結果が得られるはずです私は彼らに渡します。コードがライブラリと適切に対話することを確認できます (つまり、モックcg.nextCmd(...)
呼び出しに渡されたオブジェクトでこれをアサートすることにより、ホスト引数がトランスポート変数に正しく渡されることを確認しますか?