2012-02-15 71 views
5

我在我的Google App Engine應用程序中使用了blobstore,並且在生產服務器和開發服務器上一切工作正常。與測試平臺和webtest,但是,不能正常工作測試...GAE:使用測試平臺和webtest測試blob的下載

在我的測試中,BLOB存在,我可以這樣訪問:

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

當我嘗試下載一個blob在我這樣

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

我Blob存儲下載的處理程序測試不會被調用,我得到一個404錯誤(但鏈接的作品的開發或督促服務器上)。

我懷疑這是用測試臺或WebTest的...

任何想法的錯誤是什麼我可能是做錯了,或者這是與試驗檯/ 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), 
    ] 

回答

3

很難在沒有從main.application和app.y路由的情況下講述路由可用的aml。

我懷疑你在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/

+0

嗨舒佩,感謝您的答覆。我不認爲這是問題,但我更新了有關app.yaml和main.py的更多細節。 – 2012-02-16 01:40:40

+0

@schuppe如何在app.yaml中定義某些東西而不將它映射到main.application中的處理程序?您可以將所有內容發送到main.application,但該映射必須是更具體的映射。 – aschmid00 2012-02-16 13:58:03

+0

@ aschmid00我想檢查Jeff是否在應用程序中定義了不同的處理程序。yaml在main.application找到之前處理'/ blob-download /'的請求。在app.yaml中定義的模式按它們出現的順序進行評估。他會有一個處理程序定義的東西是匹配'/ blob-download /',然後纔可能捕獲所有的'*' - 主要它是一個簡單的解釋。但與傑夫的更新,它看起來像不是這樣.. – schuppe 2012-02-16 16:58:01