PyQt 和单元测试 - 如何处理信号和槽

问题描述 投票:0回答:2

我正在开发的一些小型应用程序使用我编写的模块来通过 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 来伪造连接并给出他们是正确的数据)。

有办法解决这个问题吗?

python pyqt unit-testing
2个回答
4
投票

在调用回调之前,您需要避免退出测试方法。 我相信调用将在单独的线程中进行,因此 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)

0
投票

您还可以使用QTest.qWait

https://doc.qt.io/qt-6/qtest.html#qWait

等待期间,事件将被处理,您的测试将保持对用户界面事件或网络通信的响应。

© www.soinside.com 2019 - 2024. All rights reserved.