【问题标题】:How to mock ndb.get_context().urlfetch?如何模拟 ndb.get_context().urlfetch?
【发布时间】:2023-03-19 22:10:02
【问题描述】:

在我的测试中,我想模拟 NDB 包提供的 urlfetch,因此在测试执行期间不会发出真正的 http 请求。

urlfetch() 返回Future,所以看来我需要知道 NDB 内部结构才能正确模拟它......我还以为我可以以某种方式模拟 google.appengine.api.urlfetch.create_rpc()......但我没有取得任何进展,所以远...

我该怎么做?

谢谢。

【问题讨论】:

    标签: google-app-engine app-engine-ndb


    【解决方案1】:

    我会回答我自己的问题。在下面的代码中,我使用 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()
    

    【讨论】:

    • 更简单的方法:self.testbed.init_urlfetch_stub(urlmatchers=[(lambda url: url.startswith("http://example.com", self.get_example_com) )。有关示例实现,请参见 urlfetch_to_gcs_stub。
    猜你喜欢
    • 2011-10-21
    • 1970-01-01
    • 2013-01-24
    • 2012-10-04
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多