我有这段代码(尝试使用非阻塞调用来测试互联网连接):
#!/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
的参数。
答案 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)
您可以导入它们并在测试中调用它们。