GAE: тестване на изтегляне на петна с testbed и webtest

Използвам blobstore с моето приложение Google App Engine и всичко работи добре на производствения сървър и сървъра за разработка. Тестването с testbed и webtest обаче не работи...

В моите тестове петното съществува, тъй като имам достъп до него по следния начин:

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

Когато се опитам да изтегля петно ​​в моите тестове като този

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

моят манипулатор за изтегляне от 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

Това е съответната част от app.yaml:

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

Това е съответната част от main.py:

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

person gaefan    schedule 15.02.2012    source източник


Отговори (1)


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

Подозирам, че сте конфигурирали "/blob-download" в app.yaml, за което webtest не знае, той знае само за маршрутизирането, което сте конфигурирали в main.application.

актуализация: След като сега app.yaml не е причината, нека продължим. Това, което би помогнало, е да видите вашия манипулатор. Отговорите за обслужване на Blobstore се обработват по различен начин от обичайните отговори. Вие, като разработчик, добавяте 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/

person schuppe    schedule 16.02.2012
comment
Здравей Шупе, благодаря за отговора. Не мисля, че това е проблемът, но актуализирах въпроса си с повече подробности за app.yaml и main.py. - person gaefan; 16.02.2012
comment
@schuppe как изобщо би било възможно да се дефинира нещо в app.yaml, без да се картографира към манипулатор в main.application? можете да изпратите всичко на main.application, но това картографиране трябва да е по-специфично. - person aschmid00; 16.02.2012
comment
@aschmid00 Исках да проверя дали Джеф има различен манипулатор, дефиниран в app.yaml, който обработва заявки към „/blob-download/“, преди main.application да стигне до него. Моделите, дефинирани в app.yaml, се оценяват в реда, в който се появяват. Ако той щеше да има дефиниран манипулатор за нещо, което съвпада с '/blob-download/' преди евентуален catch-all '.*'-main, щеше да е лесно обяснение. Но с актуализацията на Джеф изглежда, че това не е така.. - person schuppe; 16.02.2012
comment
@schuppe разбирам, но предполагам (и се надявам да е така), че ако той би обработвал /blob-download с друг манипулатор, той ще знае за това също, защото казва, че приложението работи на dev и production. тестовете не го правят. - person aschmid00; 16.02.2012
comment
@schuppe, не разбирам какво имате предвид под Вие, като разработчик, добавяте blob ключа като заглавка към отговора, тъй като аз не правя това. Обслужвам петна, както е описано тук: code.google.com/appengine /docs/python/blobstore/. Освен това моят манипулатор за изтегляне на петна никога не се извиква. Това е основният проблем, който се опитвам да поправя, и актуализирах въпроса си, за да го направя по-ясен. - person gaefan; 17.02.2012
comment
@Jeff Използвайки self.send_blob(blob_info), вие извиквате функция, която поставя blob ключа в заглавките на отговора: code.google.com/p/googleappengine/source/browse/trunk/python/. Във всеки случай можете ли да предоставите и вашата тестова функция? - person schuppe; 17.02.2012
comment
@schuppe, няма много интересно в тестовата функция... искането на петно ​​създава 404, но актуализирах въпроса си със съответните подробности за тест, който би създал този проблем. - person gaefan; 18.02.2012
comment
@kekito, почти съм сигурен, че нещо не е наред в настройката ви за маршрутизиране или обработката на заявки, защото мога да накарам основен пример да работи. Твърде дълго е, за да се побере тук (pastebin.com/FQFH1Rx6), но всъщност е съкратена версия на това, което сте предоставили, плюс някакъв код, добавен за запълване на празнините. Самият тест не минава, но манипулаторът се извиква със сигурност. Съжалявам, че не мога да бъда полезен повече. - person schuppe; 21.02.2012
comment
@schuppe, благодаря, че събра това. Въпреки това не връща петното за мен и вие не сте проверили отговора. Бихте ли опитали това и да ме уведомите, ако тестът е неуспешен?: pastebin.com/p8pY8BsE - person gaefan; 22.02.2012
comment
@Kekito Вашите тестове се изпълняват, но се провалят, което е твърде очаквано - точно като този, който поставих. Защо? Както обясних по-рано, отговорите за обслужване на Blobstore се обработват по различен начин от обичайните отговори.. Това означава, че всъщност не можете да тествате обслужването на blobs, без dev_appserver или appserver да обработват заявките - което означава, че testbed + webtest няма да ви помогнат тук. Сега поне знаете, че 404 се дължи на някаква част от вашия код, защото фрагментите с любопитни факти връщат 200. - person schuppe; 23.02.2012
comment
@schuppe, виждам, че сочиш. Превръщането на 404 в 200, което не връща петното, за съжаление, не помага много, тъй като целта е да мога да тествам използването на магазина за петна, което очевидно не мога да направя. :( - person gaefan; 24.02.2012