GAE:使用testbed和webtest测试blob的下载

gae*_*fan 5 python google-app-engine blobstore

我正在使用blobstore和我的Google App Engine应用程序,一切都在生产服务器和开发服务器上运行良好.然而,使用testbed和webtest进行测试是行不通的......

在我的测试中,blob存在,因为我可以像这样访问它:

blob = self.blobstore_stub.storage._blobs[key]
Run Code Online (Sandbox Code Playgroud)

当我尝试在我的测试中下载blob时

response = self.app.get("/blob-download/2")
Run Code Online (Sandbox Code Playgroud)

我的blobstore下载处理程序永远不会被调用,我得到404错误(但链接在dev或prod服务器上工作).

我怀疑这是testbed或webtest的错误...

关于我可能做错什么的任何想法,或者如果这是一个错误的testbed/webtest可能是一个好的工作,以便我可以测试我的代码的这部分?


以下是有关我如何设置测试的一些信息.

import unittest
from webtest import TestApp
from google.appengine.ext import db, testbed
from google.appengine.api import users
from google.appengine.api import apiproxy_stub_map

class ExampleTests(unittest.TestCase):

    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.setup_env(app_id="stv")
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_taskqueue_stub()
        self.testbed.init_mail_stub()
        self.testbed.init_blobstore_stub()
        self.app = TestApp(main.application)
        apiproxy_stub_map.apiproxy.GetStub("datastore_v3").Clear()
        self.taskqueue_stub = apiproxy_stub_map.apiproxy.GetStub('taskqueue')
        self.mail_stub = apiproxy_stub_map.apiproxy.GetStub('mail')
        self.blobstore_stub = apiproxy_stub_map.apiproxy.GetStub('blobstore')

   def testBlob(self):
        # create blob using files.blobstore.create
        response = self.app.get("/blob-download/2") # This returns 404
        self.assertEqual(response.body, "content of blob") # This fails
Run Code Online (Sandbox Code Playgroud)

这是app.yaml的相关部分:

handlers:
- url: /.*
  script: main.application
Run Code Online (Sandbox Code Playgroud)

这是main.py的相关部分:

application = webapp2.WSGIApplication(
    [
     ('/blob-download/([^/]+)?', views.BlobDownload),
    ]
Run Code Online (Sandbox Code Playgroud)

sch*_*ppe 3

如果没有来自 main.application 和 app.yaml 的路由,就很难讲述路由。

我怀疑您在 app.yaml 中配置了“/blob-download”,而 webtest 不知道它,它只知道您在 main.application 中配置的路由。

更新:现在 app.yaml 不是原因,让我们继续。见见你的处理人会有帮助。Blobstore 服务响应的处理方式与通常的响应不同。作为开发人员,您可以将 blob 键作为标头添加到响应中。App Engine 后端检查此标头端,如果发现则接管 Blob 的服务。您可以在此处查看 dev_appserver 实现: http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/tools/dev_appserver_blobstore.py#214

这意味着如果没有 dev_appserver 或 appserver 处理请求,您就无法实际测试 Blob 服务 - 这意味着 testbed + webtest 在这里不会帮助您(但它不会解释 404)。

您可以做的是运行完整的端到端测试,例如使用 gaedriver: http: //code.google.com/p/gaedriver/