使用Twisted的延迟测试

5 投票
1 回答
1961 浏览
提问于 2025-04-18 07:26

我一直在努力理解如何测试使用了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

撰写回答