我正在开发的一些小型应用程序使用我编写的模块来通过 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 将在运行时报告此测试“正常”,无论结果如何(因为正在调用另一个槽),即使断言失败(我将得到一个未处理的 AssertionError)。故意使测试失败的示例:
Test connection and posts retrieved ... ok
[... more tests...]
OK
Traceback (most recent call last):
[...]
AssertionError: 4 != 5
测试内部的插槽只是一个实验:如果它在外部(实例方法),我会得到相同的结果。
我还必须补充一点,我调用的各种方法都会发出 HTTP 请求,这意味着它们需要一些时间(我需要模拟请求 - 同时我使用 SimpleHTTPServer 来伪造连接并给出他们是正确的数据)。
有办法解决这个问题吗?
在调用回调之前,您需要避免退出测试方法。 我相信调用将在单独的线程中进行,因此 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)