2010-01-11 91 views
3

我有一個pyqt應用程序,我正在編寫單元測試,它很大程度上依賴於信號和插槽。爲了正確測試它,我必須檢查是否發送了正確的信號。PyQt&unittest - 測試信號和插槽

這樣做的最好方法是什麼?我看到Qt庫有一個QSignalSpy,但我在PyQt中找不到任何對此的參考。我能想到的唯一選擇是模擬發射,例如,

import testedmodule 

def myemit(signal): 
    .... 

testedmodule.QObject.emit = myemit 

但我希望有更好的方法。

編輯:
我的模塊運行的線程,在一個實例啓動線程,所以我更新上面的代碼,以反映此之後不再工作的這種情況下,覆蓋發光。

+0

讓Phil(PyQt的作者)知道它是必需的。他會添加它或建議一種解決方法。 – 2010-01-12 17:20:42

回答

1

你可以嘗試一個插槽連接到信號,準備測試,然後調用qApp.processEvents(),讓信號傳播。但我不認爲它是100%可靠的。

很遺憾QSignalSpy並不是PyQt的一部分。

1

這是什麼,我建議我自己,並不一定是最好的單元測試的解決方案更詳盡的版本,但我認爲這將是感興趣的其他人遇到這樣的:

發佈卡洛斯Scheidegger在PyQt的郵件列表(http://thread.gmane.org/gmane.comp.python.pyqt-pykde/9242/focus=9245

_oldConnect = QtCore.QObject.connect 
_oldDisconnect = QtCore.QObject.disconnect 
_oldEmit = QtCore.QObject.emit 

def _wrapConnect(callableObject): 
    """Returns a wrapped call to the old version of QtCore.QObject.connect""" 
    @staticmethod 
    def call(*args): 
     callableObject(*args) 
     _oldConnect(*args) 
    return call 

def _wrapDisconnect(callableObject): 
    """Returns a wrapped call to the old version of QtCore.QObject.disconnect""" 
    @staticmethod 
    def call(*args): 
     callableObject(*args) 
     _oldDisconnect(*args) 
    return call 

def enableSignalDebugging(**kwargs): 
    """Call this to enable Qt Signal debugging. This will trap all 
    connect, and disconnect calls.""" 

    f = lambda *args: None 
    connectCall = kwargs.get('connectCall', f) 
    disconnectCall = kwargs.get('disconnectCall', f) 
    emitCall = kwargs.get('emitCall', f) 

    def printIt(msg): 
     def call(*args): 
      print msg, args 
     return call 
    QtCore.QObject.connect = _wrapConnect(connectCall) 
    QtCore.QObject.disconnect = _wrapDisconnect(disconnectCall) 

    def new_emit(self, *args): 
     emitCall(self, *args) 
     _oldEmit(self, *args) 

    QtCore.QObject.emit = new_emit 

只需調用enableSignalDebugging(emitCall = FOO)窺探你的信號,直到 你病要你的胃:)

0

注QSignalSpy是在PyQt5中爲QtTest.QSignalSpy