2012-03-30 41 views
3

在我的測試中,我想模擬NDB軟件包提供的urlfetch,所以在測試執行過程中不會有真正的http請求。如何模擬ndb.get_context()。urlfetch?

urlfetch()回報Future,如此看來,我需要知道NDB內部正確地嘲笑它...此外,我想我可以嘲笑google.appengine.api.urlfetch.create_rpc()莫名其妙......但我沒有取得任何進展,到目前爲止...

我該怎麼做?

謝謝。

回答

5

我會回答我自己的問題。在下面的代碼中,我使用Michael Foord的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.startswith( 「http://example.com」,self.get_example_com))'爲一個例子見urlfetch_to_gcs_stub實現。 – rmmh 2018-01-25 00:16:09