2015-08-06 13 views
6

Sto provando a scrivere unit test per una classe in python. La classe apre una presa TCP su init. Sto cercando di deriderlo in modo tale da poter affermare che la connessione viene chiamata con i valori corretti, ma ovviamente non si verifica effettivamente nei test unitari. Ho stancato MagicMock, patch, ecc. Ma non ho trovato una soluzione.mocking una connessione socket in Python

La mia classe finora assomiglia a questo

import socket 

class MyClass(object): 

    def __init__(self): 
     self.tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.tcp_socket.connect('0.0.0.0', '6767') 
+0

perché non ju st in realtà connettersi? –

+0

@JoranBeasley perché potrebbe portare a build in stallo se la connessione impiega troppo tempo per essere stabilita. Questa è la ragione per cui abbiamo bisogno di mock. – markroxor

risposta

8

Se si desidera solo per affermare che connect si chiama correttamente, si tratta di un semplice

import mock 
import socket 

class MyClass(object): 

    def __init__(self): 
     self.tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.tcp_socket.connect('0.0.0.0', '6767') 

with mock.patch('socket.socket'): 
    c = MyClass() 
    c.tcp_socket.connect.assert_called_with('0.0.0.0', '6767') 

Se si deve importare un modulo prima di accedere a MyClass, è necessario regolare leggermente la patch:

from mymodule import MyClass 
import mock 

with mock.patch('mymodule.socket.socket'): 
    c = MyClass() 
    c.tcp_socket.connect.assert_called_with('0.0.0.0', '6767') 
+1

In Python 3.3+, puoi semplicemente "importare unittest.mock' come" mock' "è ora incluso nella libreria standard: https://docs.python.org/3/library/unittest.mock.html – phoenix