PyQt和unittest - 如何处理信号和插槽

时间:2010-03-18 21:52:41

标签: python pyqt unit-testing

我正在开发的一些小应用程序使用我编写的模块来通过REST API检查某些Web服务。我一直在努力为它添加单元测试,所以我不会破坏它,我偶然发现了一个问题。

我使用大量信号槽连接来异步执行操作。例如,典型的测试是(伪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)

现在,unittest将在运行时报告此测试为“ok”,无论结果如何(正在调用另一个插槽),即使断言失败(我将得到未处理的AssertionError)。示意性地使测试失败时的示例:

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

OK

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

测试中的插槽仅仅是一个实验:如果它在外面(实例方法),我会得到相同的结果。

我还必须补充一点,我调用的各种方法都会发出HTTP请求,这意味着他们需要花费一些时间(我需要模拟请求 - 同时我正在使用SimpleHTTPServer伪造连接并给他们适当的数据。)

有解决这个问题的方法吗?

1 个答案:

答案 0 :(得分:3)

在调用回调之前,您需要避免退出测试方法。我相信这个调用将在一个单独的线程中发生,所以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)