2017-02-24 1 views
0

Meine Klasse erstellt einige Objekte in __init__(), die über HTTP kommunizieren. Zum Beispiel:Wie teste ich Einheit eine Python-Klasse, die Objekte in dem __init__ erstellt, die verspottet werden sollen?

class StreamController(object): 
    def __init__(self, credentials): 
     self.listener = StreamListener() 
     self.stream = Stream(credentials, self.listener) 

    def methods_to_test(self): 
     # test this stuff 

Wie teste ich Einheit die StreamController und ersetzen Sie die listener und stream Variablen mit Mock-Objekte? Ich muss dieses Ding einspielen, um es zu testen, aber wenn es erstellt wird, wird es versuchen, mit dem Server zu kommunizieren. Wie verhindere ich das und teste es noch?

Antwort

1

Eine gemeinsame Idiom ist Fabriken verwenden, um die Objekte zu erstellen:

class StreamController(object): 
    _streamListenerFactory = (lambda : StreamListener()) 
    _streamFactory = (lambda credentials, listener: Stream(credentials, listener) 
    def __init__(self, credentials): 
     self.listener = _streamListenerFactory() 
     self.stream = _streamFactory(credentials, self.listener) 
    def methods_to_test(self): 
     # test this stuff 

Wenn Sie Mocks oder Stubs erstellen müssen, Sie überschreiben nur die Fabriken vor den Tests:

StreamController._streamListenerFactory = (lambda : StreamListenerMock()) 
StreamController._streamFactory = ... 
+0

Arbeiten groß. Vielen Dank. Mir war dieses Idiom nicht bewusst. – uclatommy

+0

@uclatommy In der Tat ist es sehr häufig in Java Sprache ... –

Verwandte Themen