2010-03-18 74 views
1

我正在開發的一些小應用程序使用我編寫的模塊通過REST API檢查某些Web服務。我一直在試圖向它添加單元測試,所以我不會破壞東西,而且我偶然發現了一個問題。PyQt和unittest - 如何處理信號和插槽

我使用了很多信號插槽連接來異步執行操作。例如,典型的測試將是(僞的Python)中,用postDataDownloaded作爲信號:

def testConnection(self): 

    "Test connection and posts retrieved" 

    def length_test(): 
     self.assertEqual(len(self.client.post_data), 5) 

    self.client.postDataReady.connect(length_test) 
    self.client.get_post_list(limit=5) 

現在,單元測試將報告該試驗是「OK」運行時,無論結果(作爲另一時隙是被調用),即使斷言失敗(我會得到一個未處理的AssertionError)。例如當deliberatiely使測試失敗:

Test connection and posts retrieved ... ok 
[... more tests...] 

OK 

Traceback (most recent call last): 
[...] 
AssertionError: 4 != 5 

測試內的槽僅是一個實驗:我得到相同的結果,如果它是外部(實例方法)。

我還必須補充一點,我打電話的各種方法都會發出HTTP請求,這意味着他們需要一點時間(我需要嘲笑請求 - 同時我使用SimpleHTTPServer來僞造連接並給他們適當的數據)。

有沒有辦法解決這個問題?

回答

2

您需要避免退出測試方法直到回調被調用。我相信,呼叫將在一個單獨的線程發生,所以threading.Event似乎是恰當的:

import threading 

... 

def testConnection(self): 
    "Test connection and posts retrieved" 

    self.evt = threading.Event() 

    def length_test(): 
     self.evt.set() 

    self.client.postDataReady.connect(length_test) 
    self.client.get_post_list(limit=5) 
    self.evt.wait() 
    self.assertEqual(len(self.client.post_data), 5) 
+0

感謝您的建議,我給它一個鏡頭今晚稍後。 – Einar 2010-03-19 08:02:03