2012-03-30 13 views
3

In meinen Tests würde ich gerne urlfetch von NDB-Paket zur Verfügung gestellt, so dass keine echten HTTP-Anfragen während der Ausführung der Tests gemacht werden.Wie man ndb.get_context() vortäuscht.

urlfetch() kehrt Future, so scheint es, dass ich NDB Interna wissen müssen, um es richtig zu verspotten ... Auch dachte ich, ich google.appengine.api.urlfetch.create_rpc() irgendwie verspotten konnte ... Aber ich habe keine Fortschritte machen, so weit ...

Wie kann ich das tun?

Vielen Dank.

Antwort

5

Ich werde meine eigene Frage beantworten. Im folgenden Code verwende ich mock Bibliothek von 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() 
+0

Eine einfachere Methode: 'self.testbed.init_urlfetch_stub (urlmatchers = [(Lambda url:. Url.startswith ("http://example.com", self.get_example_com))' Siehe urlfetch_to_gcs_stub für ein Beispiel Implementierung. – rmmh

Verwandte Themen