如何使用GAE dev server testbed for python模拟文件上传到blobstore

3

我希望编写一些单元测试,其中需要读取Blobstore文件

如何编写一个setUp单元测试,将一些文件放入testbed Blobstore中,以便可以通过以下方式进行读取:

blob_info = BlobInfo(blob_key)
reader = BlobReader(blob_info)
reader.readline()

编辑:

我不是在寻找测试文件API的方法,我想在测试案例setUp阶段将一些任意数据放入测试用存储区blobstore中,以便对这些数据进行测试。

1个回答

5

您可以将以下内容添加到setUp方法中,可能会将blob_key存储为self.blob_key以备后用。init_files_stub很重要,因为它使用内存Blobstore初始化文件服务。

self.testbed.init_blobstore_stub()
self.testbed.init_files_stub()
from google.appengine.api import files
file_name = files.blobstore.create(mime_type='application/octet-stream')
with files.open(file_name, 'a') as f:
    f.write('blobdata')
files.finalize(file_name)
blob_key = files.blobstore.get_blob_key(file_name)

请注意,testbed是指from google.appengine.ext import testbed,而self.testbed是testbed实例。
使用init_files_stub时,这与文档中所描述的完全相同。

如果我把我的第一个例子放在setUp里,它对我来说是有效的,它将“blobdata”(可以是图像字节或其他任何内容)写入具有ID“blob”的blob中,而您示例中的reader.read()将返回“blobdata”。如果您需要在测试中使用确切的密钥,请在setUp中保存self.blob_key。 根据API,第二个例子似乎是正确的方法,但不起作用。当您尝试使用第一个示例时,它是如何失败的? - tesdal
抱歉,我还没有测试过,你回答中的“应该可以工作”的部分让我感到困惑。与此同时,我已经找到了一个解决方案,将BlobInfo自己放入数据存储中,就像这样:datastore.Put(datastore.Entity('__BlobInfo__', name=file_path, namespace='')。你的解决方案更漂亮,谢谢伙计! - Janusz Skonieczny
第一个示例运行良好,但第二个示例在create时出现错误AssertionError:找不到服务“file”的API代理。我已经使用init_blobstore_stub进行了初始化。是否有另一种用于files API存根的初始化方法? - Janusz Skonieczny
你说得对,我的解释有些混乱,我尝试稍作修改,希望有所帮助。在测试环境中,我激活()并初始化了datastore_v3、memcache、taskqueue、blobstore,但我没有看到你提到的AssertionError。我不知道它是如何尝试使用“文件”服务或如何进行初始化的。 - tesdal
有了init_files_stub,API方法可以正常工作,应该优先使用。我已经相应地更新了我的答案。 - tesdal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接