我正在开发的一些小应用程序使用我编写的模块来通过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伪造连接并给他们适当的数据。)
有解决这个问题的方法吗?
答案 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)