2

我只是继承了一些围绕 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
4

1 回答 1

6

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

嗯,不是很干净。Twisted 的 Trial 单元测试期望延迟作为结果,断言作为回调。这里的回调是printResult,因此对于任何非空字符串,它将被评估为 true。我认为更恰当的应该是:

page = getPage(url, method='POST').addCallback(self.assertTrue)

或者

page = getPage(url, method='POST').addCallback(self.assertIsNotNone)

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

因为TestCase班级会照顾到这一点。而且它也没有使用标准反应器。

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

于 2012-04-17T16:37:23.683 回答