2010-03-18 4 views
1

내가 개발중인 일부 작은 애플리케이션은 REST API를 통해 특정 웹 서비스를 검사하기 위해 작성한 모듈을 사용합니다. 나는 물건을 부수 지 않기 위해 단위 테스트를 추가하려고 노력했습니다. 그리고 나는 문제를 발견했습니다.PyQt와 unittest - 신호와 슬롯을 처리하는 방법

많은 신호 - 슬롯 연결을 사용하여 비동기 적으로 작업을 수행합니다. 예를 들어 일반적인 테스트 신호로 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) 

, 유닛 테스트는 다른 슬롯이기 때문에 (결과에 관계없이의, 실행할 때이 테스트가 "확인"으로보고합니다 어설 션이 실패하더라도 (나는 처리되지 않은 AssertionError를 얻을 것이다). deliberatiely 테스트를 만드는 예는 실패 : 테스트 내부

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

OK 

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

슬롯은 단지 실험이다 : 그것은 외부의 (인스턴스 메소드) 만약 내가 같은 결과를 얻을 수 있습니다.

나는 또한 모든 요청을 HTTP 요청을 만드는 다양한 방법을 추가해야합니다. 즉, 요청을 조롱 할 필요가 있습니다. 즉, SimpleHTTPServer를 사용하여 해당 요청을 위조해야합니다. 연결하고 적절한 데이터를 제공하십시오).

이 문제를 해결할 수있는 방법이 있습니까?

답변

2

콜백이 호출 될 때까지 테스트 메서드를 종료하지 않아야합니다. 나는 전화가 별도의 스레드에서 일어날 것입니다 생각, 그래서 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

감사를 제안, 나는이 총에 그것을 나중에 오늘 밤을 줄 것이다. – Einar

관련 문제