单独调用回调函数?

时间:2014-12-02 16:13:50

标签: python callback tornado

我有这段代码(尝试使用非阻塞调用来测试互联网连接):

#!/usr/bin/env python
from tornado.httpclient import AsyncHTTPClient

http_client = AsyncHTTPClient()
a = ''

def on_g(response):
    if response.error:
        on_b()
    else:
        global a        
        a = response.body
        return True

http_client.fetch("http://www.google.com/", on_g)

def on_b(response):
    if response.error:
        return False
    else:
        return True
http_client.fetch("http://www.baidu.com/", on_b)

如何调用on_g()on_b()进行调试?因为它需要一个response的参数。

3 个答案:

答案 0 :(得分:2)

对于测试,您总是可以使用dict周围的简单包装来模拟参数;例如:

class Mock(dict):
    def __getattr__(self, key):
        return self[key]


on_b(Mock({    
    'error': False,
    'body': 'Mock body',
}))

然后检查全局状态的返回值/变化是否符合您的期望。

创建与Tornado完全相同的response对象是不必要的,因为Python确实duck typing。通过模拟对象,你可以100%确定各种参数是什么,通常更好进行测试,因为它更加透明。

如果您经常执行此操作,则可能需要使用较大的库(例如mock),而不是少数几次;但这应该可以用于快速测试,或者只是一些简单的测试。

答案 1 :(得分:2)

您需要模拟响应对象。我之前使用龙卷风完成了这项工作,它运作得很好。这也为您提供了控制,您可以测试任何您无法轻易复制的响应。我推荐mock包,但你也可以手工完成。

以下是使用mock包的示例:

from mock import Mock
on_b(Mock(error=False, body='body'))

这是一个手工的例子:

class Mock(object):
    pass
mock = Mock()
mock.error = False
mock.body = 'body'
on_b(mock)

答案 2 :(得分:1)

我不太确定你在问什么,但回调函数只是函数,可以像任何其他python函数一样调用

on_g(some_object)

on_b(some_object)

您可以导入它们并在测试中调用它们。