Unit testing 使用Google App Engine`files`api测试函数

Unit testing 使用Google App Engine`files`api测试函数,unit-testing,google-app-engine,Unit Testing,Google App Engine,我有一个使用Google Blobstore API的函数,下面是一个退化的例子: #!/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_fi

我有一个使用Google Blobstore API的函数,下面是一个退化的例子:

#!/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" 回溯(最近一次呼叫最后一次): 文件“e.py”,第18行,在 foo()#实际上,我是从“人造客户端”调用的函数 文件“e.py”,第8行,在foo中 blob\u filename=files.blobstore.create(mime\u type='text/plain') 文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine default.bundle/Contents/Resources/google_appengine/google/appengine/api/files/blobstore.py”,第68行,在create中 返回文件。_create(_BLOBSTORE_FILESYSTEM,params=params) 文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine default.bundle/Contents/Resources/google\u appengine/google/appengine/api/files/File.py”,第491行,在创建 _打电话(创建、请求、响应) 文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine default.bundle/Contents/Resources/google\u appengine/google/appengine/api/files/File.py”,第230行,在调用中 rpc=\u创建\u rpc(截止日期=截止日期) 文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine default.bundle/Contents/Resources/google\u appengine/google/appengine/api/files/File.py”,第213行,在创建rpc中 返回apiproxy\u stub\u map.UserRPC('文件',截止日期) 文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine default.bundle/Contents/Resources/google\u appengine/google/appengine/api/apiproxy\u stub\u map.py”,第393行,在__ self.\uu rpc=CreateRPC(服务,stubmap) CreateRPC第67行的文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine/google/appengine/api/apiproxy_stub_map.py” 断言存根,“未找到服务“%s”的api代理”%service AssertionError:未找到服务“文件”的api代理 我不想为了能够测试它而修改
foo
。在Google App Engine的单元测试中,是否有办法使
foo
按预期工作(即创建给定文件)

我希望能用它来做这件事,但我对它的理解还不够透彻,无法独自解决

我非常感谢你的想法和建议


感谢您的阅读。

您是否有机会尝试使用?我在使用它时看到了相同的错误,因为它使用自己的代码来替换api代理

当我在gaeunit.py的_run_test_suite函数中将“file”添加到代理的“as is”列表中时,错误消失了

老实说,我不确定是否需要gaeunit.py代理替换代码,因为我还在测试用例中使用最新推荐的测试床代码。所以,在这一点上,我已经用gaeunit.py对它进行了评论,它似乎也在工作

请注意,我只是在一个dev服务器上完成这些工作,在python27的GAE和python2.7上以高度实验性的模式进行


希望这能有所帮助。

这看起来像是
测试床。init\u blobstore\u stub()
已经过时,因为
dev\u appserver
inits blobstore stub不同。下面是我的
init\u blobstore\u stub
实现,它允许您在测试中对blobstore进行写入和读取

来自google.appengine.ext导入测试床
从google.appengine.api.blobstore导入blobstore\u存根、文件\u blob\u存储
从google.appengine.api.files导入文件\服务\存根
类TestbedWithFiles(testbed.testbed):
def init_blobstore_存根(自):
blob_storage=file_blob_storage.FileBlobStorage('/tmp/testbed.blobstore',
testbed.DEFAULT_APP_ID)
blob_存根=blobstore_存根。blobstore服务存根(blob_存储)
file_stub=file_service_stub.FileServiceStub(blob_存储)
self.\u寄存器\u存根('blobstore',blob\u存根)
self.\u寄存器\u存根('文件',文件\u存根)
#你的代码。。。
def foo():
从google.appengine.api导入文件
blob\u filename=files.blobstore.create(mime\u type='text/plain')
使用files.open(blob_文件名,'a')作为谷歌文件:
googfile.write(“测试数据”)
文件。完成(blob_文件名)
tb=TestbedWithFiles()
tb.activate()
tb.init_blobstore_stub()
foo()

我不知道它是否后来添加到SDK中,但使用
Testbed.init\u files\u stub
应该可以修复它:

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

在本地推送live或running时是否存在这些错误?你有最新版本的SDK吗?@eduardocereto:单元测试在本地运行,这是最新的SDK(1.6.0)。这里有一个相关的公开问题:谢谢Nathan。我使用的是本地单元测试(即不是gaeunit)。我也在使用Python2.7运行时。什么是“高度实验模式”?关于“高度实验模式”,我只是指Python2.7的使用,仅此而已。考虑到您使用的是本地单元测试,我很惊讶您看到了这个问题,因为我没有在与您的代码非常相似的上下文中看到它。祝你好运我无法重现你建议的结果。如果您以问题中的示例为例,将其放入.py文件中并执行它,是否会得到与上面相同的结果?上面的代码包含对pdf.read的错误引用。我将其替换为“测试数据”,然后代码在我的环境中成功运行,没有错误。您是否尝试过在任何测试运行程序之外运行上述代码?我找不到对此代码中使用的模块所做的任何修改。问题中列出的错误是可复制的。你是否在Mac OS X中使用GAE 1.6.0在命令行上运行代码?在我手动将默认的应用程序ID放在测试床上之后,这为我实现了这一点。这个解决方案太棒了!感谢您的分享。在SDK 1.7.1上非常有效。非常感谢!在ndb事务中创建一个时,我在测试中遇到异常(AttributeError:“Entity”对象没有属性“\u to\u pb”)