在我的测试中,我想模拟 NDB 包提供的 urlfetch,因此在测试执行期间不会发出真正的 http 请求。
urlfetch() 返回 Future ,所以似乎我需要知道 NDB 内部结构才能正确模拟它......我还以为我可以以某种方式模拟 google.appengine.api.urlfetch.create_rpc() ......但到目前为止我没有取得任何进展......

我怎样才能做到这一点?

谢谢你。

最佳答案

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

关于google-app-engine - 如何模拟 ndb.get_context().urlfetch?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9943996/

10-12 05:46