这个怎么样?对以下内容运行试用。基本上,你只是嘲笑代理并假装它做广告,并使用FakeAgent(在这种情况下)失败所有请求。如果你真的想将数据注入到交通工具中,那我想这将会“更多地做”。但是,你真的在测试你的代码吗?或代理的?
from twisted.web import client
from twisted.internet import reactor, defer
class BidnessLogik(object):
def __init__(self, agent):
self.agent = agent
self.money = None
def make_moneee_quik(self):
d = self.agent.request('GET', 'http://no.traffic.plz')
d.addCallback(self.made_the_money).addErrback(self.no_dice)
return d
def made_the_money(self, *args):
##print "Moneeyyyy!"
self.money = True
return 'money'
def no_dice(self, fail):
##print "Better luck next time!!"
self.money = False
return 'no dice'
class FailingAgent(client.Agent):
expected_uri = 'http://no.traffic.plz'
expected_method = 'GET'
reasons = ['No Reason']
test = None
def request(self, method, uri, **kw):
if self.test:
self.test.assertEqual(self.expected_uri, uri)
self.test.assertEqual(self.expected_method, method)
self.test.assertEqual([], kw.keys())
return defer.fail(client.ResponseFailed(reasons=self.reasons,
response=None))
class TestRequest(unittest.TestCase):
def setUp(self):
self.agent = FailingAgent(reactor)
self.agent.test = self
@defer.inlineCallbacks
def test_foo(self):
bid = BidnessLogik(self.agent)
resp = yield bid.make_moneee_quik()
self.assertEqual(resp, 'no dice')
self.assertEqual(False, bid.money)
我下面贴一个答案,但我一般建议将得到充分熟悉'Deferred's和'@ inlineCallbacks'和一般非阻塞/异步编程原理和概念。此外,研究gevent并将其与Twisted及其@ @ inlineCallbacks进行比较可能会进一步了解该领域(以及为什么不是Node.js)。 –