Как издеваться над ndb.get_context (). Urlfetch? - PullRequest
3 голосов
/ 30 марта 2012

В моих тестах я хотел бы смоделировать urlfetch, предоставляемый пакетом NDB, чтобы при выполнении тестов не выполнялось никаких реальных запросов http.

urlfetch() возвращает Future, поэтому мне кажется, что мне нужнознать внутренности NDB, чтобы правильно его высмеивать ... Кроме того, я думал, что могу каким-то образом высмеивать google.appengine.api.urlfetch.create_rpc() ... Но я пока не добился никакого прогресса ...

Как я могу это сделать?

Спасибо.

1 Ответ

5 голосов
/ 31 марта 2012

Я отвечу на свой вопрос.В приведенном ниже коде я использую библиотеку mock от Michael Foord.

import unittest
from google.appengine.ext import testbed, ndb
from mock import patch, Mock

class MyTestCase(unittest.TestCase):

    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_urlfetch_stub()

        # mock urlrfetch service
        uf = self.testbed.get_stub('urlfetch')
        uf._Dynamic_Fetch = Mock()

    @patch('google.appengine.api.urlfetch.urlfetch_service_pb.URLFetchResponse')
    def test_make_request(self, URLFetchResponse):
        # mocking rpc response object
        response = URLFetchResponse.return_value
        response.contentwastruncated.return_value = False
        response.statuscode.return_value = 200
        response.content.return_value = 'Hello world!'        

        ctx = ndb.get_context()
        fut = ctx.urlfetch('http://google.com')
        result = fut.get_result()

        self.assertEquals(result.content, 'Hello world!')

    def tearDown(self):
        self.testbed.deactivate()
...