PyQt и unittest - как обрабатывать сигналы и слоты - PullRequest
2 голосов
/ 19 марта 2010

небольшое разрабатываемое мной приложение использует модуль, который я написал для проверки определенных веб-сервисов через REST API. Я пытался добавить к нему юнит-тесты, чтобы не ломать вещи, и наткнулся на проблему.

Я использую много соединений с сигнальными слотами для асинхронного выполнения операций. Например, типичным тестом будет (псевдопифон) с 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 для фальсификации соединений и дать им правильные данные).

Есть ли способ обойти эту проблему?

1 Ответ

3 голосов
/ 19 марта 2010

Вам необходимо избегать выхода из метода теста, пока не будет вызван обратный вызов. Я считаю, что вызов будет происходить в отдельном потоке, поэтому 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...