2015-08-06 5 views
6

Ich versuche Einheitentests für eine Klasse in Python zu schreiben. Die Klasse öffnet einen TCP-Socket unter init. Ich versuche, dies zu verharmlosen, so dass ich behaupten kann, dass das Verbinden mit den richtigen Werten aufgerufen wird, aber offensichtlich nicht wirklich in Komponententests geschieht. Ich habe MagicMock, Patch, etc. müde aber ich habe keine Lösung gefunden.Mocking eine Socket-Verbindung in Python

Meine Klasse so weit wie dieses

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

warum nicht ju st tatsächlich verbinden? –

+0

@JoranBeasley, da dies zu einem Stillstand führen kann, wenn die Verbindung zu lange dauert. Das ist der Grund, warum wir Mocks brauchen. – markroxor

Antwort

8

sieht Wenn Sie nur behaupten wollen, dass connect korrekt genannt wird, ist es eine einfache wie

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') 

Wenn Sie ein Modul importieren müssen zuerst Zugriff MyClass, müssen Sie den Patch leicht anpassen:

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+ können Sie einfach "unittest.mock" importieren, da "mock" jetzt in der Standardbibliothek enthalten ist: https://docs.python.org/3/library/unittest.mock.html – phoenix