2012-12-05 68 views
4

我是python的新手,嘗試設置功能測試環境。測試環境應通過DBus接收信號並對其進行評估。 DBus信令使用GLib MainLoop。我有以下類封裝的循環:在單元測試中運行glib mainloop的python

class SignalLoop(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
     self.__l = gobject.MainLoop()   
    def run(self): 
     self.__l.run() 
    def quit(self): 
     self.__l.quit() 

,並在模塊中做的DBus處理我的嘗試:

class __ModuleInitializer: 
    def __init__(self): 
     print('Module was initialized') 
     gobject.threads_init() 
     sl = SignalLoop() 
     sl.start() 

    def __del__(self): 
     print('Module was deinitialized') 
     sl.quit() 

__module_init = __ModuleInitializer() 

我也試過如下:

  • 設置/ tearDownModule( )不適用於我 - 至少在python 2.5.2
  • __init __()和__del __()方法中,並將所有測試用例放在一個類中。 __del __()永遠不會被調用,並且此解決方案不會隨着大量測試用例而擴展。

當我運行代碼時,sl.qui()永遠不會執行,我不知道爲什麼。從控制檯運行時,我必須殺死我的main,因爲它永遠不會返回。然而,這對PyDev測試運行者來說不是問題。

有沒有可以用來破壞測試環境的鉤子?我希望能夠運行單個測試和幾個測試,因此將它「黑入」方法本身不是一種選擇。

你能幫我嗎?

回答

3

我不會啓動和停止在安裝和拆卸方法主循環。相反,使你的異步請求(或其他),然後通過迭代運行主循環迭代,直到你的結果到達。

例子:

make_asynchronous_request() 
main_context = GLib.MainContext.default() 
while main_context.pending(): 
    main_context.iteration(False) 
assert(result_is_ok()) 
2

我用ptomato的回答創建一個爲我工作。差異可能是由於一些python版本。在我的情況下,工作的代碼是:

make_asynchronous_request() 
main_context = GLib.MainLoop.get_context() 
while main_context.pending(): 
    main_context.iteration(False) 
assert(result_is_ok())