2017-02-24 60 views
0

我的班级在__init__()中通过HTTP进行通信时创建了一些对象。例如:如何测试在应该被模拟的__init__中创建对象的python类?

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

    def methods_to_test(self): 
     # test this stuff 

如何单元测试StreamController与模仿对象替换listenerstream变量?我将不得不实例化这个东西来测试它,但是当它被创建时,它将尝试与服务器进行通信。我如何防止并仍在测试?

回答

1

一个常见的成语是使用工厂来创建对象:

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 

如果你需要创建嘲笑或存根,你只是在测试之前,覆盖工厂:

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

的伟大工程。谢谢。没有意识到这个成语。 – uclatommy

+0

@uclatommy事实上,它在Java语言中很常见... –

相关问题