GAE: тестирование загрузки BLOB-объектов с помощью тестового стенда и веб-теста - PullRequest
5 голосов
/ 16 февраля 2012

Я использую blobstore с моим приложением Google App Engine, и все отлично работает на рабочем сервере и сервере разработки.Однако тестирование с помощью тестового стенда и webtest не работает ...

В моих тестах существует блоб, так как я могу получить к нему доступ следующим образом:

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

Когда я пытаюсь загрузить BLOB-объект в моих тестах, как этот

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

, мой обработчик загрузки blobstore никогда не вызывается, и я получаю ошибку 404 (но ссылка работает на серверах dev или prod).

Я подозреваю, что это ошибка на тестовом стенде или веб-тесте ...

Любые идеи относительно того, что я могу делать неправильно, или, если это ошибка на тестовом стенде / веб-тесте, может показаться хорошей работой?чтобы я мог проверить эту часть своего кода?


Вот некоторая информация о том, как я настраиваю свои тесты.

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),
    ]

1 Ответ

3 голосов
/ 16 февраля 2012

Трудно сказать о маршрутизации без наличия маршрутизации из main.application и app.yaml.

Я подозреваю, что вы настроили "/ blob-download" в app.yaml, веб-тест которого не известен, он знает только о маршрутизации, настроенной вами в main.application.

update : Теперь, когда у нас теперь app.yaml, это не причина, давайте двигаться дальше. Что бы помочь, это увидеть ваш обработчик. Ответы на обслуживание в интернет-магазине обрабатываются иначе, чем обычные ответы. Вы, как разработчик, добавляете ключ blob в качестве заголовка к ответу. Бэкэнд App Engine проверяет этот конец заголовка и, если он обнаруживает, что он принимает обслуживание большого двоичного объекта. Вы можете проверить реализацию dev_appserver здесь: http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/tools/dev_appserver_blobstore.py#214.

Это означает, что вы на самом деле не можете протестировать обслуживание больших двоичных объектов без обработки запросами dev_appserver или appserver - это означает, что testbed + webtest здесь вам не поможет (хотя и не объясняет 404).

Что вы можете сделать, это запустить полный сквозной тест, например, с помощью gaedriver: http://code.google.com/p/gaedriver/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...