0

我有一个管道,它在 blobstore 中创建一个 blob,并将生成的 blob_key 放在它的一个命名输出中。当我通过围绕它构建的 Web 界面运行管道时,一切都运行良好。现在我想创建一个小测试用例来执行此管道,从 blobstore 中读取 blob,并将其存储到磁盘上其他位置的临时位置,以便我可以检查它。(因为testbed.init_files_stub()仅在测试期间将 blob 存储在内存中)。

测试用例中的管道似乎工作正常,并导致看起来像一个有效的 blob_key,但是当我将该 blob_key 传递给blobstore.BlobReader类时,由于某种原因它找不到 blob。从回溯来看,BlobReader 似乎正在尝试访问真正的blobstore,而写入器(在管道内)正在写入存根blobstore。我--blobstore_path在 dev_appserver.py 上进行了设置,我没有看到测试用例写入磁盘的任何 blob,但是当我从 Web 界面运行它时,这些 blob 确实显示在那里。

这是回溯:

Traceback (most recent call last):
  File "/Users/mattfaus/dev/webapp/coach_resources/student_use_data_report_test.py", line 138, in test_serial_pipeline
    self.write_out_blob(stage.outputs.xlsx_blob_key)
  File "/Users/mattfaus/dev/webapp/coach_resources/student_use_data_report_test.py", line 125, in write_out_blob
    writer.write(reader.read())
  File "/Users/mattfaus/Desktop/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/blobstore/blobstore.py", line 837, in read
    self.__fill_buffer(size)
  File "/Users/mattfaus/Desktop/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/blobstore/blobstore.py", line 809, in __fill_buffer
    self.__position + read_size - 1)
  File "/Users/mattfaus/Desktop/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/blobstore/blobstore.py", line 657, in fetch_data
    return rpc.get_result()
  File "/Users/mattfaus/Desktop/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 604, in get_result
    return self.__get_result_hook(self)
  File "/Users/mattfaus/Desktop/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/blobstore/blobstore.py", line 232, in _get_result_hook
    raise _ToBlobstoreError(err)
BlobNotFoundError

这是我的测试代码:

def write_out_blob(self, blob_key, save_path='/tmp/blob.xlsx'):
    """Reads a blob from the blobstore and writes it out to the file."""
    print str(blob_key)
    # blob_info = blobstore.BlobInfo.get(str(blob_key))  # Returns None
    # reader = blob_info.open()  # Returns None
    reader = blobstore.BlobReader(str(blob_key))
    writer = open(save_path, 'w')
    writer.write(reader.read())
    print blob_key, 'written to', save_path

def test_serial_pipeline(self):
    stage = student_use_data_report.StudentUseDataReportSerialPipeline(
        self.query_config)

    stage.start_test()
    self.assertIsNotNone(stage.outputs.xlsx_blob_key)    
    self.write_out_blob(stage.outputs.xlsx_blob_key)
4

2 回答 2

0

原来我只是错过了.value这里的财产:

self.assertIsNotNone(stage.outputs.xlsx_blob_key)    
self.write_out_blob(stage.outputs.xlsx_blob_key.value)  # Don't forget .value!!

[更新] SDK 仪表板还公开了 blobstore 中所有 blob 的列表,按创建日期方便地排序。可在http://127.0.0.1:8000/blobstore.

于 2013-06-18T00:08:38.170 回答
0

如果您展示如何完成 blobstore 文件,或者您可以单独尝试该完成代码,这可能会很有用。听起来 Files API 没有在 dev appserver 上正确完成文件。

于 2013-06-18T00:10:09.827 回答