2014-02-25 4 views
0

SSLTest.testError는 통과하지만 tearDown 이후에 Trial 예외가 발생합니다. 비교를 위해 정상적으로 작동하는 RegularTest.testOk가 있습니다. 나는 이것을 설명하는 트위스티드 버그를 발견하지 못했고, 그래서 이것은 재현하기가 얼마나 쉬운지를 고려할 때 내가 잘못하고있는 것으로 가정합니다. 어떤 아이디어?SSL을 사용한 뒤틀린 시행 오류

여기에 코드입니다 :

from twisted.web import resource 
from twisted.internet import ssl, reactor 
from twisted.web.server import Site 
from twisted.web.client import Agent, WebClientContextFactory 
from twisted.trial.unittest import TestCase 


class DummyServer(resource.Resource): 
    isLeaf = True 

    def render(self, request): 
     return 'hello world' 


class SSLTest(TestCase): 
    def setUp(self): 
     site = Site(DummyServer()) 
     SSLFactory = ssl.DefaultOpenSSLContextFactory('../server.key', 
                 '../server.crt') 
     port = reactor.listenSSL(0, site, contextFactory=SSLFactory) 
     self.port = port 
     self.portNumber = port._realPortNumber 

    def tearDown(self): 
     self.port.stopListening() 

    def testError(self): 
     def finished(result): 
      self.assertEquals(result.code, 200) 

     url = 'https://127.0.0.1:%s' % self.portNumber 

     agent = Agent(reactor, WebClientContextFactory()) 
     d = agent.request('GET', url) 
     d.addCallback(finished) 
     return d 


class RegularTest(TestCase): 
    def setUp(self): 
     site = Site(DummyServer()) 
     port = reactor.listenTCP(0, site) 
     self.port = port 
     self.portNumber = port._realPortNumber 

    def tearDown(self): 
     self.port.stopListening() 

    def testOk(self): 
     def finished(result): 
      self.assertEquals(result.code, 200) 

     url = 'http://127.0.0.1:%s' % self.portNumber 

     agent = Agent(reactor,) 
     d = agent.request('GET', url) 
     d.addCallback(finished) 
     return d 

여기에 표준 출력입니다 :

$ trial trialerror.py 
trialerror 
    RegularTest 
    testOk ...                [OK] 
    SSLTest 
    testError ...               [OK] 
                 [ERROR] 

=============================================================================== 
[ERROR] 
Traceback (most recent call last): 
Failure: twisted.trial.util.DirtyReactorAggregateError: Reactor was unclean. 
Selectables: 
<TLSMemoryBIOProtocol #0 on 51135> 

trialerror.SSLTest.testError 
------------------------------------------------------------------------------- 
Ran 2 tests in 0.018s 

FAILED (errors=1, successes=2) 

답변

0

Jonathan Lange wrote about this problem and its solutions. 단위 테스트에서 실제 네트워크 연결을 사용하지 않을 수도 있습니다. Agent 이미 작동합니다. 따라서 Site, reactor.listenSSL 등을 수행하십시오. 코드 인 코드를 사용하고 코드가 의존하는 라이브러리의 많은 코드가 아닌 단위 테스트를 작성하십시오.

+0

사이트에서 기본 프로토콜을 얻는 방법과 지연 프로토콜을 주입하는 방법을 찾지 못했습니다. 실제로이 모든 테스트 전략을 쓸모 없게 만들 수도 있습니다. 어쨌든 링크 주셔서 감사합니다! twisted.web 테스트는 서버를 시작하고 연결하는 것보다 다른 방법을 찾으려고 노력할 것입니다. – tadeas