2016-04-27 12 views
1

mockライブラリ(unittest.mockのPython 3の場合)を使用してラッパーをsocketのモザイクにする方法はありますか?モックライブラリを使ってソケットオブジェクトをモックする方法

これは私のラッパーです:

import socket 

import utils 


class TCPSocket: 
    def __init__(self): 
     self.buf = '' 

    def __enter__(self): 
     pass 

    def __exit__(self, exc_type, exc_val, exc_tb): 
     self.close() 

    def connect(self, host, port): 
     self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.sock.connect((host, port)) 

    def close(self): 
     self.sock.close() 

    def send(self, data): 
     self.sock.send(data) 

    def sendall(self, data): 
     self.sock.sendall(data) 

    # For best match with hardware and network realities, 
    # the value of limit should be a relatively small power of 2, for example, 4096 
    def recv_some(self, limit=4096): 
     return self.sock.recv(limit) 

    def recv_bytes(self, count): 
     while len(self.buf) < count: 
      self.buf += self.recv_some() 
     parts = utils.split_first_n(self.buf, count) 
     self.buf = parts[1] 
     return parts[0] 

    def recv_until(self, delim): 
     while delim not in self.buf: 
      self.buf += self.recv_some() 
     parts = self.buf.split(delim, maxsplit=1) 
     self.buf = parts[1] 
     return parts[0] 

私はrecv_untilとrecv_bytesなどの機能は、彼らが本当に必要なものを行うかどうかをテストします。

答えて

3

それはあなたが本当のソケットを使用する場所mock_socketを使用し、その後

import mock # or from unittest import mock 


mock_socket = mock.Mock() 
mock_socket.recv.return_value = data 

ような単純なことができます。必要に応じて、ここで設定したモック値を返すためにソケットを作成するものをモックすることもできます。それはその方法あなたが設定することができます何かを返すように、あなたのケースでは


、あなたはsocket.socketを模擬することができます。この例のmock_socketは、SocketオブジェクトではなくSocketオブジェクトを返す関数であることに注意してください。

with mock.patch('socket.socket') as mock_socket: 
    mock_socket.return_value.recv.return_value = some_data 
    t = TCPSocket() 
    t.connect('example.com', 12345) # t.sock is a mock object, not a Socket 
self.assertEqual(t.recv_bytes(), whatever_you_expect) 
t.sock.connect.assert_called_with(('example.com', 12345)) 
+0

私はこのモックオブジェクトの使用方法を完全に理解していません。私は 'connect'と' recv_some'メソッドを持つ 'TCPSocket'というPythonの標準ライブラリから' socket'のラッパーを持っています。私はどうしたらいいですか? – FrozenHeart

+0

実際に 'socket'をモックする必要がありますか、' TCPSocket'インスタンスをモックする必要がありますか?必要な正確なシナリオ、つまりモックオブジェクト、入力、および期待される出力を使用するコードで質問を編集してください。 – chepner

+0

http://pastie.org/10814947 'recv_until'や' recv_bytes'のような関数が本当に必要なものを実行しているかどうかをテストしたい – FrozenHeart

関連する問題