【问题标题】:GAE: testing download of blobs with testbed and webtestGAE:使用 testbed 和 webtest 测试 blob 的下载
【发布时间】:2012-03-07 08:43:25
【问题描述】:

我将 blobstore 与我的 Google App Engine 应用程序一起使用,并且在生产服务器和开发服务器上一切正常。但是,使用 testbed 和 webtest 进行测试无法正常工作...

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

blob = self.blobstore_stub.storage._blobs[key]

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

response = self.app.get("/blob-download/2")

我的 blobstore 下载处理程序永远不会被调用,我收到 404 错误(但该链接在开发或生产服务器上有效)。

我怀疑这是 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

这是 app.yaml 的相关部分:

handlers:
- url: /.*
  script: main.application

这是 main.py 的相关部分:

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

【问题讨论】:

    标签: python google-app-engine blobstore


    【解决方案1】:

    如果没有来自 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/

    【讨论】:

    • 嗨 schuppe,感谢您的回复。我不认为这是问题所在,但我用有关 app.yaml 和 main.py 的更多详细信息更新了我的问题。
    • @schuppe 怎么可能在 app.yaml 中定义某些内容而不将其映射到 main.application 中的处理程序?您可以将所有内容发送到 main.application,但该映射必须是更具体的映射。
    • @aschmid00 我想检查 Jeff 是否在 app.yaml 中定义了一个不同的处理程序,它在 main.application 到达之前处理了对“/blob-download/”的请求。 app.yaml 中定义的模式按照它们出现的顺序进行评估。他是否会在可能的包罗万象的 '.*'-main 之前为匹配 '/blob-download/' 的东西定义一个处理程序,这将是一个简单的解释。但随着 Jeff 的更新,情况似乎并非如此......
    • @schuppe 我理解,但我想(并且希望如此)如果他用另一个处理程序处理“/blob-download”,他也会知道这件事,因为他说该应用程序可以在开发和生产。测试没有。
    • @schuppe,我不明白您所说的“作为开发人员,您将 blob 键作为标题添加到响应中”是什么意思,因为我不这样做。我按照此处所述提供 blob:code.google.com/appengine/docs/python/blobstore/…。此外,我的 blob 下载处理程序永远不会被调用。这是我要解决的主要问题,我更新了我的问题以使其更清楚。
    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多