Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何测试LoopingCall()?_Python_Twisted_Trial - Fatal编程技术网

Python 如何测试LoopingCall()?

Python 如何测试LoopingCall()?,python,twisted,trial,Python,Twisted,Trial,在我的代码中,我使用task.LoopingCall()每秒运行一些延迟函数。我想确保该函数为某些事情返回正确的值。因此,我想我可以使用一个task.clock()并调用它的advance()方法。然而,我没有得到预期的正确数量的回复 知道我做错了什么吗 下面是一个测试代码来说明我的意思。首先是服务器: from twisted.internet.protocol import Factory from twisted.protocols.basic import LineReceiver fr

在我的代码中,我使用
task.LoopingCall()
每秒运行一些延迟函数。我想确保该函数为某些事情返回正确的值。因此,我想我可以使用一个
task.clock()
并调用它的
advance()
方法。然而,我没有得到预期的正确数量的回复

知道我做错了什么吗

下面是一个测试代码来说明我的意思。首先是服务器:

from twisted.internet.protocol import Factory
from twisted.protocols.basic import LineReceiver
from twisted.internet import reactor
from twisted.internet import task
import time

class Chat(LineReceiver):

    def __init__(self):
        self.echo = None

    def connectionMade(self):
        self.echo = task.LoopingCall(self.echo_print)
        self.echo.start(1)

    def connectionLost(self, reason='whatever'):
        if self.echo is not None and self.echo.running:
            self.echo.stop()

    def lineReceived(self, line):
        if line == 'stop':
            self.echo.stop()

    def echo_print (self):
        self.sendLine("Echo")

class ChatFactory(Factory):

    def __init__(self):
        pass

    def buildProtocol(self, addr):
        return Chat()

if __name__ == "__main__":
    reactor.listenTCP(8123, ChatFactory())
    reactor.run()
现在是测试用例:

from twisted.internet import task, base
from twisted.trial import unittest
from twisted.test import proto_helpers
from chat import ChatFactory

class TestChat (unittest.TestCase):

    def setUp (self):
        self.factory = ChatFactory()
        self.clock = task.Clock()
        self.proto = self.factory.buildProtocol(('127.0.0.1', 0))
        self.tr = proto_helpers.StringTransport()
        self.proto.callLater = self.clock.callLater
        self.proto.makeConnection(self.tr)

    def tearDown (self):
        if self.proto:
            self.proto.connectionLost()

    def test_echo (self):
        self.proto.dataReceived('ook\n')
        seconds_elapsed = 5
        self.clock.advance(seconds_elapsed)
        expected = 'Echo\r\n' * seconds_elapsed
        self.assertEqual(self.tr.value(), expected)
当我对此运行py.test时,我得到:

E           FailTest: not equal:
E           a = 'Echo\r\n'
E           b = 'Echo\r\nEcho\r\nEcho\r\nEcho\r\nEcho\r\n'

注意添加
导入时间;时间。睡眠(5)
确实可以通过测试。因此,我怀疑问题在于
task.clock
没有正确使用

我相信我已经找到了问题所在

  • 默认情况下,
    LoopingCall
    正在使用反应器。我需要设置它,以便它通过类变量
    clock
    使用我自己的时钟。请参阅类文档
  • self.clock.advance(x)
    将时钟设置为时间
    x
    。它不经过
    (x-1,x-2,…,现在)
    ,因此任何应该在这些中间步骤上运行的延迟将不会运行。因此,测试中的错误是正确的行为。在从0开始到
    秒结束的循环中调用
    self.clock.advance(1)
    确实达到了预期效果

  • 上的Twisted部分值得阅读几次,以便您熟悉正在发生的事情。如果您还有更多问题,请查看扭曲的内部单元测试

    测试代码的“精简版”不够好;它需要是最小的,这样我们就不会厌倦阅读无关的细节,但它也需要足够完整,这样我们才能实际运行它,看看您的问题是什么。这个例子尤其不完整,因为你甚至没有展示你是如何构造你的
    LoopingCall
    ,这是问题最重要的部分。有关如何构造一个好例子的详细信息,请参阅。@Glyph:好的,我添加了一个玩具例子来说明我的问题。我确实修复了这个不干净的错误,因为我意识到,在tearDown()方法之后,不应该延迟运行。我一定读了十几遍了,但还是不明白。。。我现在明白了^_~很抱歉再次提出这个问题,但您能否提供更多关于如何解决第(1)点的详细信息?我有一个相关的问题:。谢谢