首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyQt &单元测试-测试信号和插槽

PyQt &单元测试-测试信号和插槽
EN

Stack Overflow用户
提问于 2010-01-12 06:14:28
回答 3查看 3K关注 0票数 4

我有一个pyqt应用程序,我正在为它编写单元测试,它严重依赖于信号和插槽。为了正确测试它,我必须检查是否发送了正确的信号。

做这件事最好的方法是什么?我看到Qt库有一个QSignalSpy,但我在PyQt中找不到任何对它的引用。我能想到的唯一选择就是mock emit,例如

代码语言:javascript
复制
import testedmodule

def myemit(signal):
    ....

testedmodule.QObject.emit = myemit

但我希望有更好的方法。

编辑:

我的模块是作为线程运行的,在这种情况下,重写实例的emit在启动线程后不再有效,所以我更新了上面的代码以反映这一点。

EN

回答 3

Stack Overflow用户

发布于 2010-01-12 18:10:29

您可以尝试将插槽连接到信号,准备测试,然后调用qApp.processEvents()让信号传播。但我不认为它是100%可靠的。

遗憾的是,QSignalSpy实际上不是PyQt的一部分。

票数 1
EN

Stack Overflow用户

发布于 2010-01-14 17:32:54

这是我自己建议的一个更详细的版本,不一定是单元测试的最佳解决方案,但我认为遇到这个问题的其他人会感兴趣:

由Carlos Scheidegger在pyqt邮件列表(http://thread.gmane.org/gmane.comp.python.pyqt-pykde/9242/focus=9245)上发布

代码语言:javascript
复制
_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)并监视您的信号,直到您反胃:)

票数 1
EN

Stack Overflow用户

发布于 2015-12-16 15:10:43

注意: QSignalSpy is available as QtTest.QSignalSpy in PyQt5。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2045352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档