有人可以解释这个Twisted单元测试吗?

ck.*_*ck. 2 python twisted.web

我刚刚继承了Twisted Python的一些单元测试,如下所示.

虽然测试有效,但我从概念上并不理解.

鉴于以下示例,有人可以解释以下事项吗?

  • 为什么这个单元测试"返回页面"?
  • 为什么没有对reactor.start()的调用?
  • 关于这种方法的利弊的任何评论,或许我可以考虑的其他方面?

def setUp(self):
    self.listening_port = reactor.listenTCP(8118, server.Site(buildSite()))        

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

def getUrl(self, extension=''):
    return 'http://localhost:%s/%s' % (self.listening_port.getHost().port, extension)

 def test(self):
     url = self.getUrl('foo')        
     def printResult(result):
         print result        
     page = getPage(url, method='POST').addCallback(printResult)
     return page
Run Code Online (Sandbox Code Playgroud)

var*_*tec 6

为什么这个单元测试"返回页面"?

嗯,它不是很干净.Twisted的Trial unittest期望Deferred为结果,断言为回调.这里回调是printResult,因此对于任何非空字符串,它将被评估为true.我认为应该是:

page = getPage(url, method='POST').addCallback(self.assertTrue)
Run Code Online (Sandbox Code Playgroud)

要么

page = getPage(url, method='POST').addCallback(self.assertIsNotNone)
Run Code Online (Sandbox Code Playgroud)

为什么没有对reactor.start()的调用?

因为TestCase上课会照顾到这一点.而且它也没有使用标准反应器.

由于单元测试避免了真正的I/O和实时,它们通常可以避免使用真正的反应器.唯一的例外是实际反应堆实施的单元测试.协议实现或其他应用程序代码的单元测试不应使用反应器.实际反应堆实施的单元测试不应使用全局反应堆,而应使用twisted.internet.test.reactormixins.ReactorBuilder,以便它们可以自动应用于所有反应堆实施.在任何情况下,新的单元测试都不应使用全局反应器.