Подтвердить что ты не робот

Тестовая функция с файлами Google App Engine `api

У меня есть функция, которая использует API Google Blobstore, и здесь вырожденный случай:

#!/usr/bin/python
from google.appengine.ext import testbed

def foo():
    from google.appengine.api import files
    blob_filename = files.blobstore.create(mime_type='text/plain')
    with files.open(blob_filename, 'a') as googfile:
        googfile.write("Test data")

    files.finalize(blob_filename)

tb = testbed.Testbed()
tb.activate()
tb.init_blobstore_stub()

foo() # in reality, I'm a function called from a 'faux client'
      # in a unittest testcase.

Погрешность:

Traceback (most recent call last):
  File "e.py", line 18, in 
    foo() # in reality, I'm a function called from a 'faux client'
  File "e.py", line 8, in foo
    blob_filename = files.blobstore.create(mime_type='text/plain')
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/files/blobstore.py", line 68, in create
    return files._create(_BLOBSTORE_FILESYSTEM, params=params)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/files/file.py", line 491, in _create
    _make_call('Create', request, response)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/files/file.py", line 230, in _make_call
    rpc = _create_rpc(deadline=deadline)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/files/file.py", line 213, in _create_rpc
    return apiproxy_stub_map.UserRPC('file', deadline)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 393, in __init__
    self.__rpc = CreateRPC(service, stubmap)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 67, in CreateRPC
    assert stub, 'No api proxy found for service "%s"' % service
AssertionError: No api proxy found for service "file"

Я не хочу изменять foo, чтобы проверить его. Есть ли способ сделать foo работать как ожидалось (т.е. Создать данный файл) в тестах модулей Google App Engine?

Я бы ожидал, что смогу сделать это с помощью прокси Google API, но я не понимаю его достаточно хорошо, чтобы понять это самостоятельно.

Буду благодарен за ваши мысли и предложения.

Спасибо за чтение.

4b9b3361

Ответ 1

Кажется, что testbed.init_blobstore_stub() устарел, потому что dev_appserver inits blobstore stubs по-разному. Вот моя реализация init_blobstore_stub, которая позволяет вам писать и читать из blobstore в ваших тестах.

 
from google.appengine.ext import testbed
from google.appengine.api.blobstore import blobstore_stub, file_blob_storage
from google.appengine.api.files import file_service_stub

class TestbedWithFiles(testbed.Testbed):

    def init_blobstore_stub(self):
        blob_storage = file_blob_storage.FileBlobStorage('/tmp/testbed.blobstore',
                                                testbed.DEFAULT_APP_ID)
        blob_stub = blobstore_stub.BlobstoreServiceStub(blob_storage)
        file_stub = file_service_stub.FileServiceStub(blob_storage)
        self._register_stub('blobstore', blob_stub)
        self._register_stub('file', file_stub)

# Your code...
def foo():
    from google.appengine.api import files
    blob_filename = files.blobstore.create(mime_type='text/plain')
    with files.open(blob_filename, 'a') as googfile:
        googfile.write("Test data")

    files.finalize(blob_filename)

tb = TestbedWithFiles()
tb.activate()
tb.init_blobstore_stub()

foo()

Ответ 2

Любая вероятность, что вы пытаетесь это сделать, используя тест-драйв gaeunit.py? Я вижу ту же ошибку при ее использовании, так как она делает собственный код для замены прокси-сервера api.

Ошибка исчезает, когда я добавлял 'файл' в список "как есть" прокси в функции _run_test_suite от gaeunit.py.

Честно говоря, я не уверен, что код замены прокси-сервера gaeunit.py необходим вообще, поскольку я также использую недавно рекомендованный тестовый код в тестовых случаях по http://code.google.com/appengine/docs/python/tools/localunittesting.html. Итак, на этом этапе я прокомментировал все это из gaeunit.py, который также работает.

Обратите внимание, что я делаю все это только на dev-сервере, в очень экспериментальном режиме на python27 в GAE с Python 2.7.

Надеюсь, что это поможет.

Ответ 3

Я не знаю, было ли это добавлено позже в SDK, но с помощью Testbed.init_files_stub следует исправить это:

tb = testbed.Testbed()
tb.activate()
tb.init_blobstore_stub()
tb.init_files_stub()