4

テスト駆動開発に関する公式チュートリアルを読みましたが、私の場合はあまり役に立ちませんでした。twisted.web.client.Agentとそのサブクラス (たとえば )を多用する小さなライブラリを作成しBrowserLikeRedirectAgentましたが、チュートリアルのコードを自分のテスト ケースに適応させるのに苦労しています。

を見ましたtwisted.web.test.test_webが、すべてのピースを合わせる方法がわかりません。たとえば、公式チュートリアルに従って、Protocolからオブジェクトを取得する方法がまだわかりませんAgent

GETエージェントと POSTデータに依存するコードの簡単なテストを作成する方法を教えてもらえますか? 追加の詳細やアドバイスは大歓迎です...

どうもありがとう!

4

3 に答える 3

4

を使用して、生活をよりシンプルに (つまり、コードをより読みやすく) してみてはいかがでしょうか@inlineCallbacks

実際、Deferredパフォーマンスや特定のユース ケースでどうしても必要な場合を除き、s を直接使用することは避け、代わりに常に s を使用することをお勧めします。これ@inlineCallbacksにより、コードを通常のコードのように保つことができます。 、非ブロッキング動作の恩恵を受けながら:

from twisted.internet import reactor
from twisted.web.client import Agent
from twisted.internet.defer import inlineCallbacks
from twisted.trial import unittest
from twisted.web.http_headers import Headers
from twisted.internet.error import DNSLookupError


class SomeTestCase(unittest.TestCase):
    @inlineCallbacks
    def test_smth(self):
        ag = Agent(reactor)
        response = yield ag.request('GET', 'http://example.com/', Headers({'User-Agent': ['Twisted Web Client Example']}), None)
        self.assertEquals(response.code, 200)

    @inlineCallbacks
    def test_exception(self):
        ag = Agent(reactor)
        try:
            yield ag.request('GET', 'http://exampleeee.com/', Headers({'User-Agent': ['Twisted Web Client Example']}), None)
        except DNSLookupError:
            pass
        else:
            self.fail()

Trial が残りの処理を行う必要があります (つまりDeferred、テスト関数から返される s を待機します ( @inlineCallbacks-wrapped callable も "魔法のように" a を返します — まだ慣れていない場合は、Deferredさらに読むことを強くお勧めします)。@inlineCallbacks

DeferredPS また、テスト関数から s を返し、終了する前にそれらが起動されるまでノーズを待機させる、nosetests 用の Twisted "プラグイン" もあります。

于 2013-08-24T11:35:03.993 に答える
2

これは、mike が言ったことと似ていますが、応答処理をテストしようとしています。他にも方法はありますが、私はこの方法が好きです。また、エージェントをラップするものをテストしてもあまり役に立たないことに同意します。プロトコルをテストする/プロトコルにロジックを保持する方がおそらく良いですが、緑色のチェックマークを追加したい場合もあります。

class MockResponse(object):
    def __init__(self, response_string):
        self.response_string = response_string

    def deliverBody(self, protocol):
        protocol.dataReceived(self.response_string)
        protocol.connectionLost(None)


class MockAgentDeliverStuff(Agent):

    def request(self, method, uri, headers=None, bodyProducer=None):
        d = Deferred()
        reactor.callLater(0, d.callback, MockResponse(response_body))
        return d

class MyWrapperTestCase(unittest.TestCase):

    def setUp:(self):
        agent = MockAgentDeliverStuff(reactor)
        self.wrapper_object = MyWrapper(agent)

    @inlineCallbacks
    def test_something(self):
        response_object = yield self.wrapper_object("example.com")
        self.assertEqual(response_object, expected_object)
于 2015-05-16T20:52:58.810 に答える
0

これはどう?以下でトライアルを実行します。基本的には、Agent をあざけり、宣伝どおりのふりをして、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)
于 2013-10-30T00:34:07.283 に答える