2012-02-15 10 views
5

Sto utilizzando il blobstore con la mia app Google App Engine e tutto funziona correttamente sul server di produzione e sul server di sviluppo. Test con banco di prova e webtest, però, non funziona ...GAE: test di download di BLOB con testbed e webtest

Nel mio test, il blob esiste come posso accedere in questo modo:

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

Quando si tenta di scaricare un blob nel mio test come questo

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

mia blobstore handler scaricare non viene mai chiamato e ottengo un errore 404 (ma il collegamento funziona sui server dev o prod).

ho il sospetto questo è un errore con banco di prova o WebTest ...

Tutte le idee su quello che potrebbe essere sbagliato, o se questo è un errore con banco di prova/webtest quello che un buon lavoro intorno potrebbe essere così che posso testare questa parte del mio codice?


Ecco alcune informazioni su come sto impostando i miei test.

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 

Questa è la quota di competenza di app.yaml:

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

Questa è la quota di competenza di main.py:

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

risposta

3

è difficile parla del routing senza avere il routing da main.application e app.y aml disponibile.

Sospetto di aver configurato "/ blob-download" in app.yaml di cui webtest non è a conoscenza, conosce solo il routing configurato in main.application.

aggiornamento: Ora che ora app.yaml non è la causa, andiamo avanti. Quello che sarebbe di aiuto è vedere il tuo gestore. Le risposte al servizio di Blobstore vengono gestite in modo diverso dalle normali risposte. Tu, come sviluppatore, aggiungi la chiave blob come intestazione alla risposta. Il back-end App Engine verifica la fine di questa intestazione e, se rileva, prende in carico la porzione del blob. Puoi controllare l'implementazione di dev_appserver qui: http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/tools/dev_appserver_blobstore.py#214.

Ciò significa che non è possibile testare la pubblicazione di BLOB senza dover utilizzare dev_appserver o appserver che elabora le richieste, ovvero testbed + webtest non sarà di aiuto in questo caso (non spiega tuttavia il 404).

Che cosa si potrebbe fare è eseguire un test completo end-to-end, ad esempio con gaedriver: http://code.google.com/p/gaedriver/

+0

Ciao Schuppe, grazie per la tua risposta. Non penso che questo sia il problema ma ho aggiornato la mia domanda con ulteriori dettagli su app.yaml e main.py. –

+0

@schuppe come sarebbe possibile definire qualcosa in app.yaml senza mapparlo a un gestore in main.application? puoi inviare tutto a main.application ma quella mappatura deve essere la più specifica. – aschmid00

+0

@ aschmid00 Volevo verificare se Jeff avesse un gestore diverso definito nell'app.yaml che gestiva le richieste a '/ blob-download /' prima che main.application lo raggiungesse. I modelli definiti in app.yaml vengono valutati nell'ordine in cui appaiono. Avrebbe avuto un gestore definito per qualcosa che corrisponde a '/ blob-download /' prima di un possibile catch-all '. *' - main sarebbe stata una spiegazione facile. Ma con l'aggiornamento di Jeff sembra che non sia così .. – schuppe

Problemi correlati