使用Twisted的延迟测试
我一直在努力理解如何测试使用了deferred的twisted代码,以及deferred本身的概念。
我有一个简单的测试,按理说应该会失败,我觉得。
根据我对Twisted测试工具Trial的理解,我应该能够返回一个deferred,当它完成时,测试也会结束。
这是我的一小段代码,也许有人能帮我。
import unittest, time
from twisted.internet import reactor, defer
class MyTest(unittest.TestCase):
def test_simple_deferred(self):
print "\nStarting Test"
my_deferred = defer.Deferred()
def print_time():
print time.time()
self.assertTrue(False)
my_deferred.addCallback(print_time)
reactor.callLater(3, my_deferred.callback)
print time.time()
return my_deferred
提前谢谢大家,我看了很多例子,但我觉得我已经看这个看得太久了。
1 个回答
5
你遇到了两个问题。
首先,为了实现特殊的延迟处理,你的测试用例需要从 twisted.trial.unittest.TestCase
这个类继承,而不是使用 Python 标准库里的那个版本。
最后,你没有正确调用 reactor.callLater
,或者说,你没有给它传递正确的参数来使用 Deferred.callback()
; 你需要给这个延迟对象一个 值。如果你不在乎这个值是什么,可以给它一个 None
。同样,回调函数也需要 接受 这个参数;你可以安全地忽略它。
from twisted.trial import unittest
#^^^^^^^^^^^^^^^^^
import time
from twisted.internet import defer
from twisted.internet import reactor
class MyTest(unittest.TestCase):
def test_simple_deferred(self):
print "\nStarting Test"
my_deferred = defer.Deferred()
def print_time(dont_care):
# ^^^^^^^^^
print time.time()
self.assertTrue(False)
my_deferred.addCallback(print_time)
reactor.callLater(3, my_deferred.callback, None)
# ^^^^^^
print time.time()
return my_deferred