unittest和QThread - 信号传输

时间:2016-05-13 13:49:51

标签: pyqt python-unittest

我正在尝试使用unittest测试Qt.QThread中的方法。

import sys
import unittest
from PyQt4 import Qt, QtCore, QtGui

class ConnectionBox(QtCore.QObject):
    """
    a class to test any signal emition
    """
    def __init__(self, *args):
        apply(QtCore.QObject.__init__,(self,)+args)
        self.signalArrived=0
        self.args=[]

    def slotSlot(self, *args):
        self.signalArrived=1
        self.args = args


class ThreadToTest(QtCore.QThread):
    """
    the thread to test
    """
    def __init__(self):
        super(ThreadToTest, self).__init__()

    def run(self):
        self.emit(QtCore.SIGNAL("signalEmited()"))


class TestSignalEmition(unittest.TestCase):
    """
    the test case
    """

    def setUp(self):
        self.app = QtGui.QApplication(sys.argv)
        self.connectionBox = ConnectionBox()

    def tearDown(self):
        self.app = None
        self.connectionBox = None

    def testThread(self):
        self.thread = ThreadToTest()
        self.app.connect(self.thread, QtCore.SIGNAL("signalEmited()"), self.connectionBox.slotSlot)
        self.thread.start()
        self.assertEqual(self.connectionBox.signalArrived, 1)
        self.thread.quit()


def suite():
    testSuite=unittest.makeSuite(TestSignalEmition)
    return testSuite


def main():
    runner = unittest.TextTestRunner()
    runner.run(suite())

if __name__=="__main__":
    main()

应该发生什么:

  1. 线程开始
  2. 线程发出信号
  3. 信号传输到slotSlot方法
  4. signalArrived设置为1
  5. 但是没有做出第3步。 它与unittest或QThread相关吗?

    感谢您的投入

    (编辑更容易看到结果)

1 个答案:

答案 0 :(得分:0)

有一些问题。

如果没有先定义信号,就无法发出信号。您需要先在QThread上创建信号才能发出信号。此外,您应该使用新式的信号/插槽语法。

class ThreadToTest(QtCore.QThread):
    signalToEmit = QtCore.pyqtSignal()

    def run(self):
        self.signalToEmit.emit()

此外,信号和插槽(以及所有其他事件处理)仅在正在运行的QApplication事件循环中发生。在您运行app.exec_()之前,事件循环才会开始。

我认为使用标准unittest框架以这种方式测试PyQt是不可能的。您可能需要查看QTest模块。