2012-03-30 3 views
3

В моих тестах я хотел бы высмеять urlfetch, предоставляемый пакетом NDB, поэтому во время выполнения тестов не выполняются никакие настоящие HTTP-запросы.Как mock ndb.get_context(). Urlfetch?

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

Как это сделать?

спасибо.

ответ

5

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

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() 
+0

Более простой метод: 'self.testbed.init_urlfetch_stub (urlmatchers = [(лямбда URL:. Url.startswith ("http://example.com", self.get_example_com))' Смотрите urlfetch_to_gcs_stub для примера реализация. – rmmh